什么是线程安全或非线程安全?

我看到了PHP的不同的二进制文件,如非线程或线程安全? 这是什么意思? 这些软件包有什么区别?


并发方法需要的背景:

不同的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的线程安全性备受争议。 如果你真的知道你在做什么,它是一种使用。

最后的笔记

如果你想知道,如果你有选择的话,我的个人建议是不要在多线程环境中使用PHP!

只说到基于Unix的环境,我想说幸运的是,如果你打算在Apache web服务器上使用PHP,你只需要考虑这一点,在这种情况下,建议你使用Apache的prefork MPM(它不使用线程,因此PHP线程安全并不重要),而且我知道的所有GNU / Linux发行版都将在您通过软件包系统安装Apache + PHP时为您做出决定,甚至不会提示您供选择。 如果你打算使用其他的网络服务器,比如nginx或者lighttpd,你将无法将PHP嵌入到它们中。 您将会看到使用FastCGI或其他平等的工具,这些模型中的PHP完全不在Web服务器之外,并且有多个PHP进程用于通过例如FastCGI来回答请求。 对于这种情况,线程安全也无关紧要。 要查看您的网站使用的是哪个版本,请将包含<?php phpinfo(); ?> <?php phpinfo(); ?>在您的网站上查找Server API条目。 这可以说像CGI/FastCGIApache 2.0 Handler

如果你也看看PHP的命令行版本 - 线程安全并不重要。

最后,如果线程安全并不重要,那么应该使用哪个版本 - 线程安全还是非线程安全? 坦率地说,我没有科学的答案! 但我猜测非线程安全的版本更快和/或更少错误,否则他们只会提供线程安全的版本,并且不打算给我们选择!


如果您将PHP作为Apache模块安装,则应该使用线程安全版本作为工作者MPM(多处理模型)。

如果您将PHP安装为CGI二进制文件,则应使用非线程安全版本。

对我而言, 我总是选择非线程安全版本,因为我总是使用nginx,或者从命令行运行PHP。


使用modphp的Apache MPM prefork是因为它很容易配置/安装。 从性能角度来看,这是相当低效的。 我的首选方法是做FastCGI / PHP-FPM。 这样你可以使用更快的MPM Worker。 整个PHP仍然是非线程的,但Apache服务于线程(就像它应该)。

所以基本上,从下到上

Linux的

Apache + MPM工作者+ ModFastCGI(不FCGI)|(或)| 切诺基|(或)| Nginx的

PHP-FPM + APC

ModFCGI不能正确支持PHP-FPM或任何外部FastCGI应用程序。 它只支持非进程管理的FastCGI脚本。 PHP-FPM是PHP FastCGI流程管理器。

链接地址: http://www.djcxy.com/p/9941.html

上一篇: What is thread safe or non

下一篇: PHP ternary operator vs null coalescing operator