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


772

我看到了PHP的不同二进制文件,例如非线程还是线程安全的?

这是什么意思?

这些软件包之间有什么区别?


18
您可以在en.wikipedia.org/wiki/Thread_safety上阅读有关线程安全的文章:关于PHP:PHP线程安全 吗?不要相信谎言:PHP并不是线程安全的,但是 PHP线程安全和非线程安全的Binarie之间是区别的有大量可用资源。在Stackoverflow或Google上搜索。
TigerTiger

Answers:


667

并发方法所需的背景:

不同的Web服务器采用不同的技术来并行处理传入的HTTP请求。一种非常流行的技术是使用线程-也就是说,Web服务器将为每个传入请求创建/专用一个线程。Apache HTTP Web服务器支持多种处理请求的模型,其中一种(称为工作程序MPM)使用线程。但是它支持另一种称为prefork MPM的并发模型,该模型使用流程-也就是说,Web服务器将为每个请求创建/指定一个流程。

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

PHP如何与网络服务器“集成”的所需背景:

PHP本身不响应实际的HTTP请求-这是Web服务器的工作。因此,我们将Web服务器配置为将请求转发到PHP进行处理,然后接收结果并将其发送回用户。有多种方法可以将Web服务器与PHP链接在一起。对于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的环境,幸运的是,如果要将PHP与Apache Web服务器一起使用,则只需要考虑这一点,在这种情况下,建议您使用Apache的prefork MPM。不使用线程,因此,PHP线程安全无关紧要),当您通过Apache + PHP的软件包系统安装Apache + PHP时,我所知道的所有GNU / Linux发行版都会为您做出决定。供选择。如果要使用其他Web服务器,例如nginxlighttpd,则无论如何都无法选择将PHP嵌入其中。您将在研究使用FastCGI或在其他完全不包含 PHP的模型中使用的东西具有多个PHP进程的Web服务器,这些进程用于通过FastCGI应答请求。对于这种情况,线程安全也无关紧要。要查看您的网站正在使用哪个版本,请<?php phpinfo(); ?>在您的网站上放置一个文件,然后查找Server API条目。这可以说像CGI/FastCGIApache 2.0 Handler

如果您还查看PHP的命令行版本,则线程安全无关紧要。

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


2
那么PHP-FPM是否没有线程?这样就解决了问题,因为在Nginx服务器上使用了快速CGI。
Xeoncross

41
令人敬畏的细节,我使用PHP进行编程已有多年了,却从未听说过。
Patrick

1
@Xeoncross:通常,这是正确的,实际上,这是在Apache之外管理PHP进程的重要原因之一。我在回答这个方面。
JM Becker

唯一的问题是PHP-FPM在Windows下不可用。至少作为本机版本。
Denis V

9
PHP的线程安全性是否仍然“备受争议”(在2015年和版本7中)?
Altiano Gerung 2015年

261

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

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

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


1
greg,您的回答应该是:“如果要将PHP作为工作人员为MPM的Apache模块安装,则应使用线程安全版本”
wlf 2012年

9
所以在Windows上xampp附带的php是NTS或TS?
2014年

1
如果您使用PHP内置的Web服务器怎么办?使用哪种PHP版本可获得最佳性能?
6

1
@Dario我认为那只是Windows。
格雷格

1
@ChristopherShaw花花公子,答案只包含意见。没有来源或理由为什么要结合使用ZTS和Apache模块。这不是有效的答案。m8即使是217 ppl也可能是错误的。
Daniel W.

30

使用带有modphp的Apache MPM prefork,因为它易于配置/安装。在性能方面,它效率很低。我最喜欢的方法是FastCGI / PHP-FPM。这样,您可以使用速度更快的MPM Worker。整个PHP仍然是非线程的,但是Apache提供了线程服务(应该如此)。

所以基本上,从下到上

的Linux

Apache + MPM Worker + ModFastCGI(NOT FCGI)|(或)| 切诺基|(或)| Nginx的

PHP-FPM + APC

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


21

根据PHP文档

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

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

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

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

  • SNMP(Unix)
  • mSQL(Unix)
  • IMAP(Win / Unix)
  • Sybase-CT(Linux,libc5)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.