不确定这是否更适合 Server Fault 或 Stack Overflow,但还是继续吧。
我在 Apache MPM prefork 上使用 mod_php 并生成一个新进程,如下所示:
<?php
exec("/usr/bin/php -f backgroundScript.php &");
?>
假设新的backgroundScript.php子进程运行很长时间……
1) 父 PHP 进程现在是否被视为空闲?它是否返回到服务器池?
2) 如果 Apache 确实终止了父 PHP 进程并返回MinSpareServers
,那么 backgroundScript.php 是否也会被清理或继续无限期运行?
3)Apache 是否还有其他方式可能无意中终止 backgroundScript.php 子进程?service httpd stop
也许?
答案1
您想在后台运行应用程序然后忘记了?
另外,执行官请注意:
笔记:
如果使用该函数启动程序,为了使其继续在后台运行,必须将程序的输出重定向到文件或其他输出流。如果不这样做,将导致 PHP 挂起,直到程序执行结束。
我的代码很丑陋,违反了以下规则:
<?php echo "pre"; exec("someuglylongandworkingthingwithoutput &"); echo "post"; ?>
刚刚在我的 Fedora 机器上用默认的 apache+php(prefork + module)进行了测试,我用 killall -9 /usr/sbin/httpd 终止了进程
- 尽管
&
- 没有,它仍然被视为正在运行。我的后台应用程序仍在运行 - 根据我上面的测试 - 它将继续
- 取决于 init 脚本如何终止 apache,与第 1 页相同。
添加后/dev/null
- 一切正常,父进程 ID 为“1”。