Foreach 函数给出 503 服务不可用
Foreach function gives 503 Service Unavailable
现在是凌晨 1 点,我花了 3-4 个小时来查看我的脚本有什么问题...
我的数据库有大约 400 封电子邮件。我将 $ChunkSize
设置为循环的计数器,并计算下一个要处理的块。
我设置了一些echo()
调试
echo "This is the " . $GLOBALS["ChunkSize"] . " chunk. <br>";
应该输出当时处理了什么chunk。
如果我禁用 mail()
那么我不会得到 503 Service Unavailable 但每个 echo()
同时显示,而不是按处理顺序显示。
我还发现有些邮件会收到,但不是每个人都会收到。此外,如果发送了一些电子邮件,这意味着 foreach()
应该至少处理了一个块,这意味着它应该至少显示一个 echo()
.
我已经设置了 break 1;
所以每次它突破 foreach()
它应该显示 echo()
和 foreach()
处理的块号但是它没有t.
我做错了什么?
$connection = mysql_connect($hostname, $username, $password);
mysql_select_db($dbname, $connection);
$result = mysql_query("SHOW COLUMNS FROM `Emails`");
while($row = mysql_fetch_array($result)){
$Addresses[] = $row['Field'];}
$Subject = "Test";
$Message = "
Test
";
$Headers = array( EMPTY FOR SECURITY REASONS );
$Headers = implode( "\r\n" , $Headers );
$ChunkAddresses = 50;
$EmailChunkArray = array_chunk($Addresses, $ChunkAddresses);
$ArraySize = count ($EmailChunkArray);
$ChunkSize = 0;
ChunkLoop: {
$EmailChunkArrayLoop = $GLOBALS["EmailChunkArray"];
foreach ($EmailChunkArrayLoop[$GLOBALS["ChunkSize"]] as $ToChunkLoop) {
if ($GLOBALS["ChunkSize"] <= $GLOBALS["ArraySize"]) {
mail($ToChunkLoop,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]);
echo "This is the " . $GLOBALS["ChunkSize"] . " chunk. <br>";
} else if ($GLOBALS["ChunkSize"] == $GLOBALS["ArraySize"]){
exit();}
$GLOBALS["ChunkSize"]++;
break 1;}
}
if ($GLOBALS["ChunkSize"] != $GLOBALS["ArraySize"]){
echo "Test. <br>";
goto ChunkLoop;
} else {
echo "Finished! <br>";}
创建只做一件事的脚本 - 发送邮件。
sendMail.php
<?php
// Get recipient from the argv array
$recipient = $_SERVER['argv'][1];
// Mail args
$subject = 'HELLOOOOOOO';
$message = 'BLablabla';
$headers = [...]; // optional or not
// Send it
mail($recipient, $subject, $message, $headers);
在你的代码里面你做的:
mail($ToChunkLoop,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]);
替换为:
$recipient = escapeshellarg($ToChunkLoop);
exec("php /path/to/sendMail.php ".$recipient." > /dev/null &"); // that will call mail script and will not wait when execution will end
随意修改我的代码示例
P.S。此解决方案适用于您不想为正常的批量邮件发送、邮件订阅或专用 vps 服务付费并且只有小型网络托管的情况。 (:
P.S..这不是一个绝妙的解决方案,但已根据问题作者
提供的要求完成
现在是凌晨 1 点,我花了 3-4 个小时来查看我的脚本有什么问题...
我的数据库有大约 400 封电子邮件。我将 $ChunkSize
设置为循环的计数器,并计算下一个要处理的块。
我设置了一些echo()
调试
echo "This is the " . $GLOBALS["ChunkSize"] . " chunk. <br>";
应该输出当时处理了什么chunk。
如果我禁用 mail()
那么我不会得到 503 Service Unavailable 但每个 echo()
同时显示,而不是按处理顺序显示。
我还发现有些邮件会收到,但不是每个人都会收到。此外,如果发送了一些电子邮件,这意味着 foreach()
应该至少处理了一个块,这意味着它应该至少显示一个 echo()
.
我已经设置了 break 1;
所以每次它突破 foreach()
它应该显示 echo()
和 foreach()
处理的块号但是它没有t.
我做错了什么?
$connection = mysql_connect($hostname, $username, $password);
mysql_select_db($dbname, $connection);
$result = mysql_query("SHOW COLUMNS FROM `Emails`");
while($row = mysql_fetch_array($result)){
$Addresses[] = $row['Field'];}
$Subject = "Test";
$Message = "
Test
";
$Headers = array( EMPTY FOR SECURITY REASONS );
$Headers = implode( "\r\n" , $Headers );
$ChunkAddresses = 50;
$EmailChunkArray = array_chunk($Addresses, $ChunkAddresses);
$ArraySize = count ($EmailChunkArray);
$ChunkSize = 0;
ChunkLoop: {
$EmailChunkArrayLoop = $GLOBALS["EmailChunkArray"];
foreach ($EmailChunkArrayLoop[$GLOBALS["ChunkSize"]] as $ToChunkLoop) {
if ($GLOBALS["ChunkSize"] <= $GLOBALS["ArraySize"]) {
mail($ToChunkLoop,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]);
echo "This is the " . $GLOBALS["ChunkSize"] . " chunk. <br>";
} else if ($GLOBALS["ChunkSize"] == $GLOBALS["ArraySize"]){
exit();}
$GLOBALS["ChunkSize"]++;
break 1;}
}
if ($GLOBALS["ChunkSize"] != $GLOBALS["ArraySize"]){
echo "Test. <br>";
goto ChunkLoop;
} else {
echo "Finished! <br>";}
创建只做一件事的脚本 - 发送邮件。
sendMail.php
<?php
// Get recipient from the argv array
$recipient = $_SERVER['argv'][1];
// Mail args
$subject = 'HELLOOOOOOO';
$message = 'BLablabla';
$headers = [...]; // optional or not
// Send it
mail($recipient, $subject, $message, $headers);
在你的代码里面你做的:
mail($ToChunkLoop,$GLOBALS["Subject"],$GLOBALS["Message"],$GLOBALS["Headers"]);
替换为:
$recipient = escapeshellarg($ToChunkLoop);
exec("php /path/to/sendMail.php ".$recipient." > /dev/null &"); // that will call mail script and will not wait when execution will end
随意修改我的代码示例
P.S。此解决方案适用于您不想为正常的批量邮件发送、邮件订阅或专用 vps 服务付费并且只有小型网络托管的情况。 (:
P.S..这不是一个绝妙的解决方案,但已根据问题作者