【问题标题】:Finding/Handling stalled PHP scripts查找/处理停滞的 PHP 脚本
【发布时间】:2010-12-01 17:06:55
【问题描述】:

我使用 Ajax 启动一个可能需要几个小时才能运行的 PHP 脚本。它是异步完成的,因此即使浏览器关闭,PHP 脚本也会完成。

我需要处理任何因任何原因而停止/挂起的 PHP 脚本。解决此问题的最佳方法是什么?有没有办法获取可用于定期检查活动的 PHP 脚本的进程 ID?在开始新的脚本之前,我需要杀死所有未完成的脚本。

谢谢, 布赖恩

【问题讨论】:

  • 不是解决您的问题的方法,但是从浏览器启动一个可以运行数小时的脚本感觉不对:您有没有办法从命令行发送它,也许使用 cron 作业?
  • 我希望我能对 Pascal MARTIN 的评论投 10 次左右。

标签: php ajax find scripting hung


【解决方案1】:

一个解决方案可能基于这个想法:

  • 在长时间运行脚本的开头,使用getmypid 获取其PID(进程ID)
  • 将该 PID 存储在文件中
  • 在脚本结束时,就在它结束之前,删除该文件。

当另一个进程启动时,它可以检查该文件是否存在:

  • 如果是,并且文件中包含 PID 的进程仍在运行,请执行以下操作:
    • 要么杀了它
    • 或者停止,考虑到一个进程同时运行就足够了
  • 如果文件存在,但具有该 PID 的进程不存在,则意味着您的第一个进程已死亡(例如致命错误)
  • 如果文件不存在,则表示第一个进程正常完成

关于检测进程是否正在运行并最终杀死它,我不确定 PHP 是否提供这种功能...可能需要使用 exec 来调用像 ps 这样的命令行实用程序和kill...

【讨论】:

  • 谢谢,非常有帮助。是的,我可以通过 exec 运行它。更多细节:1)并非所有都需要几个小时 - 有些只需要几分钟,2)限制是每个用户一个进程,而不是全部,一次可能有几十个用户或更多。作为后续,PHP 脚本是否有一种有效的方法来监控资源,这样我就不会炸毁我的服务器?
  • 如果你在 Linux 服务器上,也许php.net/sys_getloadavg 可以做(取决于你做什么);;如果一次有几十个用户和进程,注意不要“吃掉”太多的 Apache 进程,因为只有 MaxClients 可以同时运行。
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多