【问题标题】:Long running PHP script stops when called through exec(), but finishes when called through the CLI长时间运行的 PHP 脚本在通过 exec() 调用时停止,但在通过 CLI 调用时结束
【发布时间】:2014-05-03 03:53:45
【问题描述】:

我有一堆脚本需要很长时间才能完成。其中一些可能需要长达 20 分钟。

有一个执行这些 PHP 脚本的 Bash 脚本。当我通过 CLI 以 root 身份调用此 Bash 脚本时,所有 PHP 脚本都可以顺利完成。但是当我通过浏览器调用带有 PHP 的 exec() 函数的 Bash 脚本时,脚本在 7/8 分钟后突然停止而没有抛出任何错误。

通过 Apache/PHP 执行的进程或脚本的运行时间是否有一定的限制?

我试过了:

  • set_time_limit(0)
  • exec('nohup /path/to/bashscript')
  • exec('/path/to/bashscript | at now')

其他对长时间运行脚本有问题的人推荐了最后两个尝试过的解决方案,但它对我一点帮助都没有。

注意: 执行 PHP 脚本的 Bash 脚本是 CakePHP 的控制台应用程序。我必须通过这个 Bash 脚本执行 PHP 脚本,以利用 CakePHP 的所有功能(模型、shell 方法等)。而且我需要能够通过浏览器调用 Bash 脚本,并让它在后台运行。

服务器是 VPS 并安装了 WHM/cPanel。

【问题讨论】:

    标签: php linux bash shell cakephp


    【解决方案1】:

    您需要使用增加最大执行时间(设置 0 时要小心,它会使您的执行时间无限)

     ini_set('max_execution_time', 0);
    

    但我会推荐给用户

       proc_open();
    

    通过 exec(); 这将管道您的流程,您也可以查询其他流程。读 更多关于 proc_open [这里] http://www.sitepoint.com/proc-open-communicate-with-the-outside-world/!

    【讨论】:

    • 刚试过 ini_set('max_execution_time', 0),但似乎没有帮助。我会尝试 proc_open();谢谢!
    • proc_open() 执行进程并返回控制客户端运行另一个任务。
    【解决方案2】:

    设置:

    ini_set('max_execution_time', 0);
    

    在脚本的最顶部。这将禁用时间限制。但是,imo 在浏览器中执行 20 分钟的脚本没有多大意义。

    【讨论】:

    • 刚试过。没有帮助。此外,脚本在后台运行。浏览器不必等待它完成。但脚本确实需要从浏览器启动。
    • 请注意,如果您在后台运行脚本,Web 服务器进程确实必须等到脚本完成(即使浏览器同时关闭连接)您可以使用top 验证这一点。我会鼓励你使用类似 gearman 的东西,或者实现你自己的,基于 cron 的工作系统
    • 嗯不知道,但这是有道理的。我想我确实需要另一种方法。
    • 看看Gearman,这应该可以满足您的需求:)(但它确实是企业级的东西。也许您可以自己制作更轻量级的东西)
    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2012-11-22
    • 2012-10-12
    相关资源
    最近更新 更多