PHP脚本停止运行,503服务不可用
我有自己的PHP脚本发送新闻稿。它工作得很好。最近,我的主机提供商给我指出了一个需要遵守的配额:每分钟30封邮件。因此,在每次邮件发送之间,我插入PHP脚本停止运行,503服务不可用,php,execution,Php,Execution,我有自己的PHP脚本发送新闻稿。它工作得很好。最近,我的主机提供商给我指出了一个需要遵守的配额:每分钟30封邮件。因此,在每次邮件发送之间,我插入sleep(2) 由于该更改,在5分钟(300秒)后,脚本停止并返回: 服务不可用 由于维护停机或容量问题,服务器暂时无法为您的请求提供服务。请稍后再试。 此外,尝试使用ErrorDocument处理请求时遇到503 Service Unavailable错误 四项观察 在我的脚本开头,我写了以下两行: ignore_user_abort(true);
sleep(2)代码>
由于该更改,在5分钟(300秒)后,脚本停止并返回:
服务不可用
由于维护停机或容量问题,服务器暂时无法为您的请求提供服务。请稍后再试。
此外,尝试使用ErrorDocument处理请求时遇到503 Service Unavailable错误
四项观察
在我的脚本开头,我写了以下两行:
ignore_user_abort(true);
set_time_limit(0);
因此,问题不是来自max_execution_time变量(我验证:它确实被修改了)
该脚本在localhost
上正常工作,其中PHP ini变量比我的web主机上的变量更有限。因此,问题不是来自内存限制
变量
我认为这可能是Apache超时变量限制(300)。但我的主机提供商对此表示怀疑
服务器在PHP5.5上工作
这可能是什么原因造成的
之前的脚本(与PHPMailer一起使用):
//所有电子邮件地址
而($row=$result->fetch_array())
{
// ...
如果($mail->send())
{
回显“成功:.”行[“邮件”]。“
”;
}
其他的
{
回显“错误:.”行[“邮件”]。“-”$mail->ErrorInfo。“
”;
}
}
之后:
// all email addresses
while ($row = $result->fetch_array())
{
...
if ($mail->send())
{
echo "success : " . $row["mail"] . "<br/>";
}
else
{
echo "error : " . $row["mail"] . " - " . $mail->ErrorInfo . "<br/>";
}
sleep(2);
}
//所有电子邮件地址
而($row=$result->fetch_array())
{
...
如果($mail->send())
{
回显“成功:.”行[“邮件”]。“
”;
}
其他的
{
回显“错误:.”行[“邮件”]。“-”$mail->ErrorInfo。“
”;
}
睡眠(2);
}
我认为在服务器上使用了mod_fastcgi或同等版本
看看这篇旧文章
例如,mod_fastcgi有一个名为“-idle timeout”的选项,用于控制脚本的空闲时间。因此,如果脚本在那么长的时间内没有向fastcgi处理程序输出任何内容,那么fastcgi将终止它。设置有点像这样:
apachemod_fastcgi php进程
您应该使用队列和crontab,队列每分钟处理一次
希望这能有所帮助。这可能是很多事情,甚至是文件权限。我会先撤销你的更改,看看它是否能再次工作。如果不是,那么您就知道不是sleep()命令导致了问题。如果是sleep命令,那么问题可能与等待php响应时超时有关。尝试睡眠0.1秒,只是为了测试它是否有效。能否将不起作用的脚本包括在内。。。?我们还不是很有洞察力。我改进了你问题的格式,使它更容易阅读。请在中查看Stack Overflow的格式化文档,以便您下次可以自己执行此操作。请注意,列表中的代码块需要为每个列表级别缩进四个空格,再加上四个空格表示代码块。在每次邮件发送时,脚本都会输出邮件地址。。。所以,没有闲置时间,不是吗?Apache是通过lsphp(litespeed)在我的服务器上运行的。我还没有使用lsphp。从命令行执行脚本,如php send_mails.php
。我测试了“rengaw83”解决方案。5分钟后,仍然有一个中断。。。实际上,这不是litespeed,而是mod_lsapi。没有apache限制,因此我的主机提供商(他们删除了所有apache限制)。。。我将尝试命令行。您的问题编辑看起来像,您从数据库获取地址。最简单的方法是,添加一个新列dispatched
或其他任何内容。在从数据库提取时,您将添加到调度的位置!=1
和对查询限制0,30
。因此,每次运行只能获得30个条目。邮件发送后,必须将db条目的dispatched
标志更新为1。因此,您有一个简单的队列,可以通过crontab或任何您想要的方式进行调度。确定吗?仅发送30封邮件大约需要5分钟或更长时间?我不这么认为。如果无法将服务器/FPM配置为运行更长时间,则必须通过cli运行该脚本,或者最好是每个cron运行只发送30封邮件,并且cron应每分钟运行一次。
// all email addresses
while ($row = $result->fetch_array())
{
...
if ($mail->send())
{
echo "success : " . $row["mail"] . "<br/>";
}
else
{
echo "error : " . $row["mail"] . " - " . $mail->ErrorInfo . "<br/>";
}
sleep(2);
}
Apache <-> mod_fastcgi <-> php processes