使用exec进行长时间运行的脚本

时间:2014-11-08 22:48:10

标签: php ubuntu process cron exec

我想从API和API中获取一些数据,并在数据库中为该用户保存,此操作需要随机时间,具体取决于时间,有时甚至需要4个小时, 我在php的后台使用exec&执行脚本,

我的问题是对于长时间运行的作业是安全的,我不太了解fork和linux进程等所以我不知道CPU核心内部发生了什么,

这是我发现让我困惑的事情,

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

有人可以告诉我,如果我和exec一起走向正确的方向吗?

脚本完成后会自行终止进程吗?

由于

1 个答案:

答案 0 :(得分:2)

那么,那篇文章是关于过程"树"以及子进程如何依赖于它产生的父进程。

PHP实例启动子进程(通过exec或类似的进程)。如果它没有等待进程输出,则PHP脚本结束(例如,响应被发送到浏览器),但进程将处于空闲状态,等待它的子进程完成。

这个问题是,在apache决定杀死其父进程(因为你有太多空闲进程)之前,子进程(长时间运行4小时进程)无法保证完成其工作,并且实际上是杀死它的孩子。

然后,该文章的作者提出了使用守护进程并将子进程与父进程分开的建议。

修改

回答您在评论中留下的问题,这里是对他在文章中使用的命令的快速解释

echo /usr/bin/php -q longThing.php | at now

从左到右开始。

  • echo 打印到标准输出(STDOUT)你放在它前面的东西......
  • echo /usr/bin/php -q longThing.php将打印到shell /usr/bin/php -q longThing.php
  • | (管道)直接将上一个命令的STDOUT提供给下一个命令的标准输入(STDIN)。
  • at 从STDIN读取命令并在指定时间执行它们。 at now表示命令将立即执行。

所以基本上这与在shell中运行以下序列是一样的:

  1. at now - 打开at提示符
  2. /usr/bin/php -q longThing.php - 我们要运行的命令
  3. ^D(按Control + D) - 保存作业

  4. 所以,关于你的问题:

      

    PARENT PHP脚本结束后会立即杀死子进程吗?

    没有。

      

    在未来的某个时刻,孩子的过程会被杀死吗?

    是。 Apache会为您解决这个问题。

      

    子进程会在被杀之前完成其工作吗?

    也许。也许不吧。 Apache可能会在它完成之前将其杀死。发生这种情况的可能性随着空闲进程的数量和进程完成所花费的时间而增加。


    旁注:

    我认为这篇文章的确指向了正确的方向,但我不喜欢直接从PHP产生进程的想法。事实上,PHP没有适当的工具来运行(长期和/或密集)bg工作。仅使用PHP,您几乎无法控制它。

    但是,我可以为您提供我们在前一段时间遇到的类似问题时找到的解决方案。我们创建了一个小程序,它接受并排队数据处理请求(大约5分钟)并在请求完成时报告。这样我们就可以控制同时运行的进程数,内存使用情况,同一用户的请求数等等。

    该程序实际上托管在另一台局域网服务器上,这可以防止内存使用量激增,从而降低网络服务器的速度。

    在前端,当通过长轮询完成请求时,将通知用户