运行分叉的php应用程序

时间:2009-11-01 12:23:02

标签: php memory-leaks fork

在网络上运行分叉的PHP应用程序有什么缺点?

我已经读过它不应该出于任何原因在Apache下运行,但从未解释过为什么 我能想到的唯一原因是,如果脚本在执行过程中被终止,任何分叉进程都不会被终止并可能导致内存泄漏。

问题在于pcntl扩展

<?php
$pid = pcntl_fork();
if ($pid)
{
  //parent, execute parent code
}
else
{
  //child code
}
?>

我在这个假设中是否正确?

1 个答案:

答案 0 :(得分:3)

从Apache服务器进程调用fork()(然后不执行)是一个非常糟糕的主意。

主要问题是文件描述符仍将与父级共享,这意味着数据库连接和套接字之类的东西将以无用的方式共享。

而不是使用fork(),而只是生成一个单独的进程 - 如果你想运行PHP,运行PHP命令行可执行文件来运行脚本来做你想做的任何事情。

否则你会导致Apache做坏事 - 例如,如果父进程在同一连接上提供更多请求,并且你的分叉进程发送一些输出,它将在任意点交错响应 - 这将产生看似随机的难以诊断的错误。如果连接是SSL(SSL会话将包含错误并意外终止,在我的经验中创建一些奇怪的浏览器错误),事情的效果会更差。

虽然fork()看起来很方便,但根本不值得冒险。它在一般情况下不起作用。