不同的web服务器处理高并发的HTTP请求的方式是不同的。一个相对流行的方式是使用线程处理请求——web服务器为每一个请求创建/销毁一个线程。Apache HTTP web服务器使用worker MPM支持多线程模型处理请求。Apache也支持使用prefork MPM,用进程来处理并发的请求——-服务器为每个请求创建/销毁一个进程。worker MPMprefork MPM可以理解为Apache的工作方式。

 

也有不同的用于处理请求的并发模型(例如异步IO),不过就回答thread-safety PHP还是no thread-safety PHP版本选择来说,我们暂时只考虑上面提到的两种模型,以Apache HTTP服务器作为例子。

 

PHP本身是无法响应HTTP请求的,由web服务器响应请求。所以我们要做的就是配置web服务器转发请求到PHP那里进行加工,然后收到加工后的结果并返还回给用户。链接web服务器和PHP的方式有多种 。对于Apache HTTP服务器,最流行的方式是mod_phpPHP作为Apache的模块,可以使PHP正确的加载到web服务器中。

也有其它的方式链接PHPApache和其它的web服务器,但是mod_PHP是较流行的用法。

我们可能并没有了解太多的细节,因为linux发行版已经为们准备好了每件事情。

回到选用PHP版本问题上。mod_php可以正确的加载到Apache之中,如果Apache打算使用Worker MPM处理并发请求,PHP必须要能够操作多线程的环境----意味着PHP必须是thread-safety的才能够和Apache良好的协作。

这时候,你可能会想,好吧,我选用多线程的web服务器加载PHP,那么我必须选择thread-safety PHP。然而实际上,thread-safety PHP是广受争议的,当你选用它的时候,你最好真正的知道你到底在做什么。

当然,并不是不可以使用多线程的环境。如果你正在使用NginxLighthttpd,你应该就不会想装载PHPweb服务器中,而是使用FastCGI或者一些等价的模型。

想看一些你的网站目前应用的是什么类型的,在服务器的目录下放一个包含的文件。然后查找API条目,在那里会提到一些类似于CGI/FastCGI或者Apache 2.0 Handler的东西。

 

最后,是选择thread-safety还是no-thread-safetyPHP呢?我并没有科学的答案,但是我猜测no-thread-safety的版本更快和更少的问题,不然的话,官方应该只提供thread-safety版本的了,也不会困扰我们让我们难以选择了。

 

总结:

  1. Thread-safety 版本的PHP广受争议。

  2. Web服务器多线程工作模型可以使用其它的方案代替。

  3. 选择no-threads-safety版本的PHP应该会快一些和更少的问题(这只是猜测)