Php Foreach函数使503服务不可用

Php Foreach函数使503服务不可用,php,foreach,http-status-code-503,Php,Foreach,Http Status Code 503,现在是凌晨1点,我挣扎了3-4个小时,看看我的脚本有什么问题 我的数据库有大约400封电子邮件。我将$ChunkSize设置为循环计数器,并计算下一个要处理的块 我已将一些echo()设置为调试 echo "This is the " . $GLOBALS["ChunkSize"] . " chunk. <br>"; 创建只做一件事的脚本-发送邮件 sendMail.php <?php // Get recipient from the argv array $recipi

现在是凌晨1点,我挣扎了3-4个小时,看看我的脚本有什么问题

我的数据库有大约400封电子邮件。我将
$ChunkSize
设置为循环计数器,并计算下一个要处理的块

我已将一些
echo()
设置为调试

echo "This is the " . $GLOBALS["ChunkSize"] . " chunk. <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);
替换为:

$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
您可以随意修改我的代码示例

另外,此解决方案适用于您不想为正常的批量邮件发送、邮件订阅或专用vps服务付费,并且只有小型web主机的情况。(:


顺便说一句,这不是一个出色的解决方案,但它符合问题作者提供的要求

@SumutiuMarius我怀疑您的脚本达到了
最大执行时间
(通常为5分钟,请检查您的php设置)不必考虑在命令行中运行它,没有人会通过Web面向脚本来发送批邮件。编写CLI脚本来检查某个操作队列并完成您的工作。发送邮件不是那么快的操作。@ SUUTUMUARUS OK,您只需要进行Web托管。所以很少有解决方案:1。使用<代码>邮件格式化< /代码>服务-推送您的所有MAI。使用
mailchimp
服务-这是
邮件订阅系统
,你推送邮件文本,它会将你的邮件发送给订阅者,3.有大量的服务为你的需要提供免费的专用服务器实例:
DigitalOcean
(优惠券代码:
DROPLET10
)如果你在互联网上搜索,
Heroku
C9
,还有更多。如果企业想要赚钱-企业必须为技术浪费金钱。@SumutiuMarius请记住-开发者的时间比可以购买技术来加快进度的时间更昂贵。你为这个问题浪费了1-2天,而你可以用正确的方法浪费1小时服务/工具,客户可以购买这些服务/工具,然后快速切换到其他有利可图的任务。@SumutiuMarius DigitalOcean中的最小水滴是5美元,使用优惠券代码
DROPLET10
,您可以获得10美元奖金,并享受2个月的免费服务。此外,还可以使用mailchimp、mailgrid-提供免费批量邮件发送和邮件订阅服务。我还可以打电话给您l您可以执行以下操作:创建只发送电子邮件的php脚本,并使用进程分叉技术在后台异步调用该脚本(),或者使用
pthreads
(),或者使用nohup()调用该脚本@SumutiuMarius我很高兴它能工作。但请记住不要太吵-不要一次发送50个,最好让100毫秒暂停
睡眠(100000)
在每次调用之间。否则邮件服务器可能会认为脚本是垃圾邮件等。它不会一次发送50封。这是每个区块中的电子邮件数量,但foreach会对区块中的每封电子邮件执行SendMail.php,或者至少这是我理解的。我想你的意思是
usleep()
因为
sleep(100000)
意味着27小时:)我可以通过
exec()发送更多数组吗?例如:
exec(“php/SendMail.php”。$Receiver.,.$AnotherArray.>/dev/null&”)我做了编辑。我想请你看看我修改了什么。我不是PHP专家,也不确定我所做的是否好。我通过
exec()
导出了整个电子邮件区块,并在
SendMail.php
文件中设置了
foreach()
,因此
mail()
将对
exec()
发送的区块中的每个数组执行
mail()。
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