PHP 4和5,Ctrl-C,system()和子进程

时间:2008-10-02 23:07:34

标签: php windows system children copy-paste

我有一个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应用程序的启动代码,但未发现信号处理方面的任何差异。

任何可能导致此问题或解决方法的提示都将不胜感激。

感谢。

2 个答案:

答案 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()