PHP -从web应用程序(而不是cli)调用pcntl_fork -为什么不呢?


PHP - Calling pcntl_fork from web app (not cli) - Why not?

我熟悉php中用于生成新进程,分支等的各种方法。我所读到的一切都敦促反对使用pcntl_fork从一个网络可访问的应用程序。谁能告诉我为什么这是不推荐的?

在最基本的层面上,我知道如果你不小心,事情很快就会失控。但是如果你很小心呢?在我的例子中,我想pcntl_fork父脚本到一个新的子脚本中,运行一系列简短的特定函数,然后关闭子脚本。看起来很简单,对吧?我这么做还会有危险吗?

在一个相关的注意事项上,谁能谈谈这样做的另一种方式涉及的开销…调用proc_open()来启动一个全新的PHP进程?我是否会因为启动新流程而失去任何可能的速度提升?

背景:考虑一个大约有2000个并发用户运行fastcgi的站点

您考虑过gearman 'fork '新进程吗?它也被描述为"分布式分叉机制",因此您的工作人员不需要在同一台机器上。

同步和异步调用也可用。

您可以在这里找到它:http://gearman.org/,它可能是解决问题的备选方案。

我想提出另一种可能性…告诉我你对这件事的看法。

如果我创建了一个web服务器池,其唯一的任务是响应来自主应用程序服务器的任务请求,会怎么样?我会写这样的:

Master Application Server (Apache, PHP - FastCGI)

  • Application Worker Server (Apache, PHP - FastCGI)
  • Application Worker Server (Apache, PHP - FastCGI)
  • Application Worker Server (Apache, PHP - FastCGI)
  • Application Worker Server (Apache, PHP - FastCGI)

我将使用异步套接字向我的"工人"发送作业请求,而不是在主应用程序服务器上生成新的PHP进程。然后,worker将实时运行这些作业,并将结果发送回主应用程序服务器。

有人试过吗?你预见到什么问题吗?在我看来,这可能会非常有效。

问题不在于该应用程序可通过网络访问。

问题是web服务器(或者这里的FastCGI模块)可能不能很好地处理分叉。