在网络上运行分叉的PHP应用程序有什么缺点?
我已经读过它不应该出于任何原因在Apache下运行,但从未解释过为什么 我能想到的唯一原因是,如果脚本在执行过程中被终止,任何分叉进程都不会被终止并可能导致内存泄漏。
问题在于pcntl扩展
<?php
$pid = pcntl_fork();
if ($pid)
{
//parent, execute parent code
}
else
{
//child code
}
?>
我在这个假设中是否正确?
答案 0 :(得分:3)
从Apache服务器进程调用fork()(然后不执行)是一个非常糟糕的主意。
主要问题是文件描述符仍将与父级共享,这意味着数据库连接和套接字之类的东西将以无用的方式共享。
而不是使用fork(),而只是生成一个单独的进程 - 如果你想运行PHP,运行PHP命令行可执行文件来运行脚本来做你想做的任何事情。
否则你会导致Apache做坏事 - 例如,如果父进程在同一连接上提供更多请求,并且你的分叉进程发送一些输出,它将在任意点交错响应 - 这将产生看似随机的难以诊断的错误。如果连接是SSL(SSL会话将包含错误并意外终止,在我的经验中创建一些奇怪的浏览器错误),事情的效果会更差。
虽然fork()看起来很方便,但根本不值得冒险。它在一般情况下不起作用。