2

我有一个 PHP 脚本,它使用system()调用来执行其他(可能长时间运行的)程序(感兴趣:NCBI BLAST、phrap、primer3 和其他用于进行 DNA 序列分析和组装的程序)。

我在 Windows XP 下运行,在命令提示符下使用 PHP 的 CLI 版本,或者作为服务运行。(无论哪种情况,我都通过数据库表中的任务队列与它通信)。

在 PHP4 下:当我点击Ctrl+时C,脚本停止并且当时运行的任何子进程也停止。在 PHP5 下:当我点击Ctrl+时C,脚本停止,但孩子仍在运行。

同样,当将脚本作为服务运行时,使用 PHP4 运行时停止服务会停止子进程,而使用 PHP5 时子进程会继续运行。

我尝试编写一个最小的测试应用程序,并发现了相同的行为。测试 PHP 脚本仅使用 system() 执行 C 程序(仅休眠 30 秒),然后等待按键被按下。

我查看了 PHP 4.4.9 和 5.2.6 的源代码,但在 system() 代码中没有发现它们会导致这种情况的差异。我还快速查看了 CLI 应用程序的启动代码,并没有发现信号处理方面的任何差异。

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

谢谢。

4

2 回答 2

2

此问题至少出现在 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 发送给孩子的示例代码。它有很多关于子进程和信号的其他代码和信息。

于 2008-10-03T02:09:09.363 回答
2

不要使用 system(),而是看一下proc_open()proc_close()proc_terminate()

于 2008-10-13T17:41:27.997 回答