PHP脚本停止运行,503服务不可用

PHP脚本停止运行,503服务不可用,php,execution,Php,Execution,我有自己的PHP脚本发送新闻稿。它工作得很好。最近,我的主机提供商给我指出了一个需要遵守的配额:每分钟30封邮件。因此,在每次邮件发送之间,我插入sleep(2) 由于该更改,在5分钟(300秒)后,脚本停止并返回: 服务不可用 由于维护停机或容量问题,服务器暂时无法为您的请求提供服务。请稍后再试。 此外,尝试使用ErrorDocument处理请求时遇到503 Service Unavailable错误 四项观察 在我的脚本开头,我写了以下两行: ignore_user_abort(true);

我有自己的PHP脚本发送新闻稿。它工作得很好。最近,我的主机提供商给我指出了一个需要遵守的配额:每分钟30封邮件。因此,在每次邮件发送之间,我插入
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