我有一个PHP脚本,它使用system()
调用来执行其他(可能是长期运行的)程序(感兴趣:NCBI BLAST,phrap,primer3和其他用于进行DNA序列分析和组装的程序)。 / p>
我在Windows XP下运行,在命令提示符下使用CLI版本的PHP,或作为服务运行。 (在任何一种情况下,我都通过数据库表中的任务队列与它进行通信。)
在PHP4下:当我点击 Ctrl + C 时,脚本会停止,此时运行的所有子进程也会停止。 在PHP5下:当我点击 Ctrl + C 时脚本停止,但是孩子仍在运行。
同样,当将脚本作为服务运行时,使用PHP4运行脚本时停止服务会停止子项,使用PHP5,子项继续运行。
我尝试编写一个最小的测试应用程序,并发现了相同的行为。测试PHP脚本只使用system()来执行一个C程序(只能休眠30秒),然后等待按下一个键。
我查看了PHP 4.4.9和5.2.6的源代码,但是看不出它们会导致这种情况的system()代码没有差异。我还快速查看了CLI应用程序的启动代码,但未发现信号处理方面的任何差异。
任何可能导致此问题或解决方法的提示都将不胜感激。
感谢。
答案 0 :(得分:1)
至少在PHP 5.1.2中会出现此问题。
当通过CTRL + C或CTRL + BREAK发送SIGINT时,将调用该处理程序。如果此处理程序将SIGTERM发送给其他子节点,则不会收到信号。
SIGINT可以通过posix_kill()发送,并且完全按照预期工作 - 这仅适用于通过硬中断启动时。
来自:http://php.oregonstate.edu/manual/en/function.pcntl-signal.php
该文档包含用于捕获CTRL + C并将posix_kill发送给子级的示例代码。 它有许多关于儿童进展和信号的其他代码和信息。
答案 1 :(得分:1)
不要使用系统(),而是查看proc_open(),proc_close()和proc_terminate()。