在PHP中,线程安全或非线程安全是什么?

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

并发方法需要的背景:

不同的Web服务器实现不同的技术来并行处理传入的HTTP请求。 一个非常stream行的技术是使用线程 – 也就是说,Web服务器将为每个传入的请求创build/专用一个线程。 Apache HTTP Web服务器支持处理请求的多个模型,其中一个(称为worker MPM)使用线程。 但它支持另一种称为prefork MPM的并发模型,它使用进程 – 也就是说,Web服务器将为每个请求创build/专用一个进程。

还有其他完全不同的并发模型(使用asynchronous套接字和I / O),以及将两个甚至三个模型混合在一起的模型。 为了回答这个问题,我们只关注上面的两个模型,并以Apache HTTP服务器为例。

PHP需要如何与Web服务器“集成”

PHP本身不响应实际的HTTP请求 – 这是Web服务器的工作。 所以我们configurationweb服务器将请求转发给PHP进行处理,然后接收结果并发回给用户。 有多种方式链接Web服务器与PHP。 对于Apache HTTP Server,最stream行的是“mod_php”。 这个模块实际上是PHP本身,但作为Web服务器的一个模块编译,所以它被正确加载。

还有其他一些链接PHP和Apache和其他Web服务器的方法,但mod_php是最stream行的方法,也将回答你的问题。

您可能以前不需要了解这些细节,因为托pipe公司和GNU / Linux发行版为我们准备了一切。

现在,到你的问题!

由于使用mod_php,PHP会直接加载到Apache中,如果Apache要使用Worker MPM处理并发(也就是使用线程),那么PHP必须能够在相同的multithreading环境中运行 – 也就是说, PHP必须线程安全可以和Apache正常玩球!

在这一点上,你应该思考“OK,所以如果我使用的是multithreading的Web服务器,并且要embeddedPHP,那么我必须使用线程安全版本的PHP”。 这将是正确的想法。 然而,正如它发生的那样,PHP的线程安全性是非常有争议的 。 这是一个使用,如果你真的知道你在做什么。

最后的笔记

如果你想知道,我的个人build议是不要在multithreading环境中使用PHP!

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

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

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

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

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

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

所以基本上是从下到上

Linux的

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

PHP-FPM + APC

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

根据PHP文档 ,

下载PHP时线程安全是什么意思?

线程安全意味着二进制文件可以在multithreading的web服务器上下文中运行,例如Windows上的Apache 2。 线程安全通过在每个线程中创build本地存储副本来工作,以便数据不会与另一个线程冲突。

那么我select什么? 如果您select将PHP作为CGI二进制文件运行,那么您将不需要线程安全性,因为二进制文件在每个请求时都会被调用。 对于multithreading的Web服务器,例如IIS5和IIS6,应该使用PHP的线程版本。

以下库不是线程安全的。 他们不build议在multithreading环境中使用。

  • SNMP(Unix)
  • mSQL(Unix)
  • IMAP(Win / Unix)
  • Sybase-CT(Linux,libc5)