我看到了不同的PHP二进制文件,比如非线程或线程安全?
这是什么意思?
这些包之间的区别是什么?
发布于 2011-05-12 21:37:57
需要有关并发方法的背景知识:
不同的web服务器采用不同的技术来并行处理传入的HTTP请求。一种非常流行的技术是使用线程--也就是说,web服务器将为每个传入的请求创建/专用一个线程。Apache HTTP web服务器支持多种处理请求的模型,其中之一(称为worker MPM)使用线程。但它支持另一种称为prefork MPM的并发模型,该模型使用进程--也就是说,web服务器将为每个请求创建/专用一个进程。
还有其他完全不同的并发模型(使用异步套接字和I/O),以及将两个甚至三个模型混合在一起的模型。为了回答这个问题,我们只关注上述两种模型,并以Apache HTTP服务器为例。
需要了解PHP如何与web服务器“集成”的背景知识:
PHP本身并不响应实际的HTTP请求--这是web服务器的工作。因此,我们将web服务器配置为将请求转发到PHP进行处理,然后接收结果并将其发送回用户。有多种方法可以用PHP链接web服务器。对于Apache HTTP Server,最流行的是"mod_php“。这个模块实际上是PHP本身,但被编译为web服务器的一个模块,因此它直接加载到其中。
还有其他方法可以将PHP与Apache和其他web服务器链接起来,但mod_php是最流行的一种,也可以用来回答你的问题。
你以前可能不需要理解这些细节,因为托管公司和GNU/Linux发行版为我们准备了一切。
现在,来看你的问题!
由于使用mod_php,PHP被直接加载到Apache中,如果Apache要使用它的Worker MPM (即使用线程)来处理并发,那么PHP必须能够在这个相同的多线程环境中操作--这意味着,PHP必须是线程安全的,才能正确地使用Apache!
此时,您应该在想“好吧,如果我使用的是多线程web服务器,并且我要将PHP直接嵌入其中,那么我必须使用线程安全版本的PHP”。这将是正确的想法。然而,碰巧的是PHP的线程安全is highly disputed。这是的地面。
结束语
如果你想知道,我个人的建议是在多线程环境中使用而不是如果你有选择的话!
仅说到基于Unix的环境,我想说幸运的是,只有当你打算在Apache web服务器上使用PHP时,你才需要考虑到这一点,在这种情况下,建议你使用Apache的prefork MPM (它不使用线程,因此,PHP线程安全无关紧要),我所知道的所有GNU/Linux发行版在你通过他们的软件包系统安装Apache + PHP时,都会为你做这个决定,甚至不会提示你做出选择。如果您打算使用其他won服务器,如nginx或lighttpd,您将无法选择将PHP嵌入到它们中。你将会看到使用FastCGI或者其他类似的东西,在不同的模型中,PHP完全在web服务器之外,有多个PHP进程用于应答请求,例如FastCGI。对于这种情况,线程安全也无关紧要。要查看您的网站正在使用哪个版本,请在您的网站上放置一个包含<?php phpinfo(); ?>的文件,并查找Server API条目。这可能是类似于CGI/FastCGI或Apache 2.0 Handler的内容。
如果您还查看了PHP的命令行版本,那么线程安全性并不重要。
最后,如果线程安全无关紧要,那么您应该使用哪个版本--线程安全版本还是非线程安全版本?坦率地说,我没有一个科学的答案!但我猜非线程安全版本会更快和/或错误更少,否则他们只会提供线程安全版本,而不会费心给我们选择!
发布于 2010-11-22 01:35:00
对我来说,我总是选择非线程安全的版本,因为我总是使用nginx,或者从命令行运行。
如果您将PHP安装为CGI二进制文件、命令行界面或其他仅使用单线程的环境,则应使用非线程安全版本。
如果将PHP作为Apache模块安装在worker MPM (多处理模型)或其他多个PHP线程并发运行的环境中,则应使用线程安全版本。
发布于 2011-07-19 01:55:08
使用带有modphp的Apache MPM prefork是因为它易于配置/安装。在性能方面,它的效率相当低。我首选的堆栈方式是FastCGI/PHP-FPM。这样你就可以使用更快的MPM Worker了。整个PHP仍然是非线程化的,但Apache提供线程化服务(就像它应该做的那样)。
所以基本上,从下到上
Linux
阿帕奇+ MPM Worker + ModFastCGI (非FCGI) |(或)|切诺基|(或)| Nginx
PHP-FPM + APC
ModFCGI不能正确支持PHP-FPM或任何外部FastCGI应用程序。它只支持非进程管理的FastCGI脚本。PHP-FPM是PHP FastCGI进程管理器。
https://stackoverflow.com/questions/1623914
复制相似问题