协慌网

登录 贡献 社区

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

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

答案

并发方法所需的背景:

不同的 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(即使用线程)来处理并发性,则 PHP 必须能够在相同的多线程环境中运行 - 这意味着PHP 必须具有线程安全性,能够与 Apache 正确玩球!

此时,您应该考虑 “确定,因此,如果我使用的是多线程 Web 服务器,并且要将 PHP 直接嵌入其中,则必须使用线程安全的 PHP 版本”。这将是正确的想法。但是,碰巧的是,PHP 的线程安全性备受争议 。如果您确实真的知道您在做什么,这是一种使用。

最后的笔记

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

只说基于 Unix 的环境,幸运的是,如果要在 Apache Web 服务器上使用 PHP,则只需要考虑这一点,在这种情况下,建议您使用 Apache 的 prefork MPM。不使用线程,因此,PHP 线程安全无关紧要),当您通过 Apache + PHP 的软件包系统安装 Apache + PHP 时,我所知道的所有 GNU / Linux 发行版都会为您做出决定。供选择。如果要使用其他 Web 服务器,例如nginxlighttpd ,则无论如何都无法选择将 PHP 嵌入其中。您将研究使用FastCGI或在其他模型中工作的等同工具,其中 PHP 完全在 Web 服务器之外 ,并且具有多个 PHP 进程,这些进程用于通过 FastCGI 应答请求。对于这种情况,线程安全也无关紧要。要查看您的网站正在使用哪个版本,请放置一个包含<?php phpinfo(); ?>的文件<?php phpinfo(); ?>在您的站点上,并查找Server API条目。这可以说像CGI/FastCGIApache 2.0 Handler

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

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

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

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

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

使用带有 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 流程管理器。