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

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

这是什么意思?

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


答案 1

需要的并发方法背景知识:

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

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

需要有关PHP如何与Web服务器“集成”的背景知识:

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(即使用Threads)处理并发性,那么PHP必须能够在相同的多线程环境中运行 - 这意味着,PHP必须是线程安全的,以便能够正确地与Apache一起玩球!

在这一点上,你应该想“好吧,所以如果我使用多线程Web服务器,并且我要将PHP嵌入其中,那么我必须使用PHP的线程安全版本”。这是正确的想法。然而,碰巧的是,PHP的线程安全性存在很大争议。这是一个用途 - 如果你真的 - 真的 - 知道你在做什么 - 在做。

结语

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

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

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

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


答案 2

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

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

如果您在工作 MPM(多处理模型)或其他同时运行多个 PHP 线程的环境中将 PHP 作为 Apache 模块安装 , 则应使用线程安全版本 - 简单地说,PHP 的任何 CGI/FastCGI 构建都不需要线程安全。


推荐