【问题标题】:PHP script stops running with 503 service unavailablePHP 脚本停止运行并出现 503 服务不可用
【发布时间】:2017-04-19 19:09:12
【问题描述】:

我有自己的 PHP 脚本来发送时事通讯。它工作得很好。最近,我的托管服务提供商向我指出了一个值得尊重的配额:30 封邮件/分钟。所以,在每次发送邮件之间,我插入sleep(2);

由于该更改,在 5 分钟(300 秒)后,脚本停止并返回:

服务不可用

由于维护停机或容量问题,服务器暂时无法满足您的请求。请稍后再试。 此外,在尝试使用 ErrorDocument 处理请求时遇到 503 Service Unavailable 错误。

四个观察。

  1. 在我的脚本的开头,我放了这两行:

    ignore_user_abort(true);
    set_time_limit(0);
    

    所以,问题不在于 max_execution_time 变量(我验证:它确实被修改了)。

  2. 脚本在 localhost 上正常工作,其中 PHP ini 变量比我的 Web 主机上更受限制。所以,问题不在于memory_limit 变量。

  3. 我认为这可能是 Apache Timeout 变量限制 (300)。但我的主机提供商对此持怀疑态度...

  4. 服务器在 PHP 5.5 上运行。

这可能是什么原因造成的?

之前的脚本(它适用于 PHPMailer):

// all email addresses
while ($row = $result->fetch_array())
{
    // ...

    if ($mail->send())
    {
        echo "success : " . $row["mail"] . "<br/>";
    }
    else
    {
        echo "error : " . $row["mail"] . " - " . $mail->ErrorInfo . "<br/>";
    }
}

之后:

// 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);
}

【问题讨论】:

  • 你能包括那个不工作的脚本吗...?我们还不是很灵。
  • 我改进了您问题的格式,使其更易于阅读。请查看 help centre 中的 Stack Overflow 格式文档,以便您下次可以自己执行此操作。请注意,列表中的代码块需要为每个列表级别缩进四个空格,再加上四个空格来表示代码块。

标签: php execution


【解决方案1】:

我也遇到过类似的问题。

这可能会帮助别人,而不是直接回答给定的问题。

一个类中有两个方法互相调用。

function method1(){
     method2();
}

function method2(){
    method1();
}

比这个例子稍微复杂一点

在这种情况下是否会出现不同的错误...

【讨论】:

  • 是什么让您认为这是这里的问题?如果是,在添加sleep 之前脚本如何正常工作?
【解决方案2】:

这实际上可能是很多事情,甚至是文件权限。我会先撤消您的更改,看看它是否再次起作用。如果不是,那么您知道它不是导致问题的 sleep() 命令。如果是 sleep 命令,则问题可能与等待 php 响应时的超时有关。尝试睡眠 0.1 秒,只是为了测试它是否有效。

【讨论】:

    【解决方案3】:

    我认为在服务器上使用了 mod_fastcgi 或 equals。

    看看这个老帖子http://www.binarytides.com/php-set-time-limit/

    例如 mod_fastcgi 有一个名为“-idle-timeout”的选项,它控制脚本的空闲时间。因此,如果脚本在这么多秒内没有向 fastcgi 处理程序输出任何内容,那么 fastcgi 将终止它。设置有点像这样:

    Apache <-> mod_fastcgi <-> php processes
    

    您应该使用队列和 crontab,队列每分钟处理一次。

    希望这会有所帮助。

    【讨论】:

    • 每次发送邮件时,脚本都会输出邮件地址...所以,没有不活动(空闲时间),不是吗? Apache 正在通过 lsphp (litespeed) 在我的服务器上运行。
    • 我还没用过lsphp。从命令行执行脚本,如php send_mails.php
    • 我测试了“rengaw83”解决方案。 5分钟后,还是中断……其实不是litespeed,而是mod_lsapi。没有 apache 限制,所以我的主机提供商(他们删除了所有 apache 限制)...我将尝试命令行。
    • 您的问题编辑看起来像,您从数据库中获取地址。最简单的方法是,添加一个新列 dispatched 或其他。在从数据库获取时,您将 WHERE dispatched != 1Limit 0, 30 添加到查询中。所以每次运行只能获得 30 个条目。邮件发送后,您必须将 db 条目的 dispatched 标志更新为 1。因此您有一个简单的队列,可以通过 crontab 或任何您想要的方式安排。
    • 确定吗?仅发送 30 封邮件需要大约 5 分钟或更长时间?我不这么认为。如果无法将服务器/FPM 配置为运行更长时间,则必须通过 cli 运行脚本,否则每次 cron 运行时应该只发送 30 封邮件,并且 cron 应该每分钟运行一次。
    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2019-10-30
    相关资源
    最近更新 更多