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..这不是一个绝妙的解决方案,但已根据问题作者

提供的要求完成