【问题标题】:How to circumvent the max_execution_time in PHP?如何规避 PHP 中的 max_execution_time?
【发布时间】:2014-03-04 10:32:04
【问题描述】:

我尝试将消息邮寄给许多订阅者。我需要执行我的脚本长时间max_execution_time 允许的时间更长。我可以使用 Cron Tab,它每次都会按计划执行我的脚本,但是我可以在没有 cron 选项卡的情况下执行此操作吗?我尝试这样的事情:

    $maxTime = ini_get('max_execution_time');
    $startTime = time();
    foreach ($emails as $email) {
        if (time() < $startTime + $maxTime - 2) {
            // do something
        } else {
            // reload this page
        }
    }

它运行良好,但是如果我在浏览器选项卡中关闭此页面,它就会死掉并且不会重新加载。我提醒一下,我正在寻找实现这个没有 Cron Tab。我想手动开始执行一次,然后在后台运行。

注意:另外我想指出,我不考虑在这个阶段服务器上的负载和发送邮件的可能间隔!

【问题讨论】:

  • 线程化 php 会在限制内拆分工作而不触发您的主机施加的执行超时如何?
  • 我无法在托管时禁用 max_execution_time。我现在有 30 秒的限制
  • set_time_limit(0); 让它永远不会超时
  • @micb 谢谢,但我使用的是共享主机,set_time_limit 功能已被主机禁用。 (
  • @Victor 你可以用header("Location: http://domain.com/process.php?lastId=1"); 做到这一点。发送每条记录后,页面将重新加载,然后您只需将其传递给标题函数的最后一个 ID 即可。然后你可以让它从它停止的地方开始。这应该可以解决 30 秒超时问题,但在共享主机上,如果您开始使用大量服务器资源,您可能会发现托管您网站的公司会感到不安。

标签: php cron crontab mailing


【解决方案1】:

你有几个选择:

命令行 您最好的选择是在命令行上手动运行它。命令行脚本更适合运行长时间运行的进程。

Shell 执行器 如果您必须通过浏览器运行,您可以使用exec 触发命令行脚本,例如 shell_exec('php -f /var/www/domain.com/myLongRunningProcess.php &gt; /dev/null 2&gt;/dev/null &amp;')

忽略用户中止 您也可以在浏览器与浏览器会话分离后运行。这是最复杂和最难调试的,但它会起作用。您必须计算页面的确切大小,然后发送输出并使用函数ignore_user_abort,以便您的脚本在浏览器退出时继续运行。

【讨论】:

  • 我尝试使用ignore_user_abort(TRUE),但是当我的脚本自动重新加载页面时,脚本的执行会停止(
  • 也许买个便宜的vps
  • 是的,我正在考虑。但我不明白为什么使用header() 函数重新加载页面后执行停止。 (
  • 好的,这里有一个提示。使用 javascript 重定向而不是标头。但是,是的,只需获得一个 vps
  • 我认为 JS 重定向不起作用,因为当页面输出到浏览器时 - 脚本执行已经停止。
猜你喜欢
  • 2015-07-03
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2012-02-03
  • 1970-01-01
  • 2021-04-02
  • 2012-04-19
相关资源
最近更新 更多