Apache 何时/如何终止在 PHP 中生成的子进程?

Apache 何时/如何终止在 PHP 中生成的子进程?

不确定这是否更适合 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.net 上有很多关于此的帖子

另外,执行官请注意:

笔记:

如果使用该函数启动程序,为了使其继续在后台运行,必须将程序的输出重定向到文件或其他输出流。如果不这样做,将导致 PHP 挂起,直到程序执行结束。

相同的这里这里这里 ETC

我的代码很丑陋,违反了以下规则:

<?php
echo "pre";
exec("someuglylongandworkingthingwithoutput &");
echo "post";
?>

刚刚在我的 Fedora 机器上用默认的 apache+php(prefork + module)进行了测试,我用 killall -9 /usr/sbin/httpd 终止了进程

  1. 尽管&- 没有,它仍然被视为正在运行。我的后台应用程序仍在运行
  2. 根据我上面的测试 - 它将继续
  3. 取决于 init 脚本如何终止 apache,与第 1 页相同。

添加后/dev/null- 一切正常,父进程 ID 为“1”。

相关内容