我想从API获取一些数据,并将其保存在数据库中,此操作根据时间随机进行,有时甚至需要4小时,我正在后台php、中使用exec
和&
执行脚本
我的问题是,对于长时间运行的工作来说,执行是安全的,我对fork和linux进程等不太了解,所以我不知道CPU内核、内部发生了什么
,这是我发现的让我困惑的东西
http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html
有人能告诉我,我和执行官的方向是否正确吗?
脚本完成后进程会自行终止吗?
感谢
好吧,那篇文章是关于流程的"树";以及子进程如何依赖于它生成父进程。
PHP实例启动一个子进程(通过exec或类似程序)。如果不等待进程输出,PHP脚本将结束(例如,响应将发送到浏览器),但进程将处于空闲状态,等待其子进程完成。
这样做的问题是,在apache决定杀死它的父进程(因为你有太多空闲进程)并有效地杀死它的子进程之前,子进程(长时间运行的4小时进程)不能保证完成它的工作。
然后,本文作者提出了使用守护进程并将子进程与父进程分离的建议。
编辑:
回答你在评论中留下的问题,下面是他在文章中使用的命令的快速解释
echo /usr/bin/php -q longThing.php | at now
从左到右。
- echo将你放在它前面的东西打印到标准输出(STDOUT),所以
echo /usr/bin/php -q longThing.php
将打印到外壳/usr/bin/php -q longThing.php
|
(pipeline)将上一个命令的STDOUT直接馈送到下一命令的标准输入(STDIN)- 处的从STDIN读取命令,并在指定时间执行这些命令。
at now
表示命令将立即执行
所以基本上,这与在shell中运行以下序列是一样的:
at now
-在提示下打开/usr/bin/php -q longThing.php
-我们要运行的命令^D
(按Control+D)-保存作业
所以,关于你的问题:
在PARENT PHP脚本结束后,子进程会立即被终止吗
没有。
在未来的某个时刻,子进程会被杀死吗
是的。Apache会帮你解决这个问题。
子进程会在被杀死之前完成它的工作吗
也许吧。也许不是。阿帕奇可能会在它完成之前杀死它。发生这种情况的几率随着空闲进程的数量和进程完成所需的时间而增加。
旁注:
我认为这篇文章确实指向了正确的方向,但我不喜欢直接从PHP生成进程的想法。事实上,PHP没有合适的工具来运行(长时间和/或密集的)bg工作。仅凭PHP,您几乎无法控制它
然而,我可以给你我们为我不久前遇到的类似问题找到的解决方案。我们创建了一个小程序,可以接受数据处理请求并对其进行排队(大约5分钟长),并在请求完成时返回报告。通过这种方式,我们可以控制同一时间可以运行的进程数量、内存使用情况、同一用户的请求数量等
该程序实际上托管在另一个局域网服务器上,这防止了内存使用峰值减慢了网络服务器的速度。
在前端,当请求通过长轮询完成时,将通知用户,