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

时间:2009-10-26 09:41:33

标签: php multithreading thread-safety packages threadcontext

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

4 个答案:

答案 0 :(得分:622)

并发方法的背景知识:

不同的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要使用其工作MPM(即使用线程)处理并发,那么PHP必须能够在同一个多线程环境中运行 - 这意味着, PHP必须是线程安全的才能正确地与Apache玩球!

此时,您应该考虑“好的,所以如果我使用多线程Web服务器并且我要将PHP嵌入其中,那么我必须使用PHP的线程安全版本” 。这是正确的思考。然而,正如它发生的那样,PHP的线程安全is highly disputed。如果你真的知道自己在做什么,这是一种用法。

最后的笔记

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

仅说到基于Unix的环境,我想说幸运的是,如果你要将PHP与Apache Web服务器一起使用,你只需要考虑这个,在这种情况下,建议你使用prefork MPM Apache(不使用线程,因此,PHP线程安全无关紧要)和我所知道的所有GNU / Linux发行版都将在您通过其软件包系统安装Apache + PHP时为您做出决定甚至提示你做出选择。如果您打算使用其他网络服务器,例如nginxlighttpd,则无论如何都无法将PHP嵌入其中。您将看到使用FastCGI或类似的东西,它们在不同的模型中工作,其中PHP完全之外的Web服务器,其中有多个PHP进程用于通过例如来回答请求。 FastCGI的。对于这种情况,线程安全也无所谓。要查看您的网站使用的版本,请在您的网站上放置包含<?php phpinfo(); ?>的文件,然后查找Server API条目。这可以说是CGI/FastCGIApache 2.0 Handler

如果你也看一下PHP的命令行版本 - 线程安全无关紧要。

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

答案 1 :(得分:248)

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

如果您将PHP安装为CGI二进制文件,命令行界面或仅使用单个线程的其他环境,则应使用非线程安全版本。

如果在工作者MPM(多处理模型)或其他多个PHP线程同时运行的环境中将PHP作为Apache模块安装,则应使用线程安全的版本。

答案 2 :(得分:28)

使用带有modphp的Apache MPM prefork,因为它易于配置/安装。性能方面,效率相当低。我喜欢的堆栈方式,FastCGI / PHP-FPM。这样你就可以使用速度更快的MPM Worker。整个PHP仍然是非线程的,但Apache服务于线程(就像它应该)。

所以基本上,从下到上

Linux的

Apache + MPM Worker + ModFastCGI(非FCGI)|(或)|切诺基|(或)| nginx的

PHP-FPM + APC

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

答案 3 :(得分:19)

根据PHP Documentation

下载PHP时线程安全意味着什么?

  

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

     

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

以下库不是线程安全的。建议不要在多线程环境中使用它们。

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