我熟悉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模块)可能不能很好地处理分叉。