运行分叉的php应用程序

运行分叉的php应用程序,php,memory-leaks,fork,Php,Memory Leaks,Fork,在web上运行分叉PHP应用程序的缺点是什么 我曾读到,出于任何原因,它都不应该在Apache下运行,但从未解释过原因。 我能想到的唯一原因是,如果脚本在执行过程中被终止,任何分叉的进程将永远不会被终止,并且可能导致内存泄漏。p> 问题在于pcntl扩展 <?php $pid = pcntl_fork(); if ($pid) { //parent, execute parent code } else { //child code } ?> 我的假设正确吗?从Apac

在web上运行分叉PHP应用程序的缺点是什么

我曾读到,出于任何原因,它都不应该在Apache下运行,但从未解释过原因。
我能想到的唯一原因是,如果脚本在执行过程中被终止,任何分叉的进程将永远不会被终止,并且可能导致内存泄漏。p> 问题在于pcntl扩展

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

我的假设正确吗?

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

主要的问题是,文件描述符仍将与父级共享,这意味着数据库连接和套接字等内容将以一种无用的方式共享

而不是使用fork(),然后只生成一个单独的进程-如果您想运行PHP,请运行PHP命令行可执行文件来运行脚本,以执行您想执行的任何操作

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


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

只是澄清一下:您是在谈论PHP()的PCNTL扩展吗?我建议使用PHP fpm进行多处理和分叉处理。