需要有关并发方法的背景知识:
不同的 Web 服务器采用不同的技术来并行处理传入的 HTTP 请求。一种非常流行的技术是使用线程——也就是说,Web 服务器将为每个传入请求创建/专用一个线程。 Apache HTTP Web 服务器支持多种模型来处理请求,其中一种(称为工作 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 要使用其 Worker MPM(即使用线程)来处理并发,那么 PHP 必须能够在同一个多线程环境中运行——这意味着, PHP 必须是线程安全的,才能正确使用 Apache!
此时,您应该会想“好吧,所以如果我使用的是多线程 Web 服务器并且我打算将 PHP 直接嵌入其中,那么我必须使用 PHP 的线程安全版本” .这是正确的想法。然而,碰巧的是,PHP 的线程安全is highly disputed。这是一个“如果你真的真的知道你在做什么”的地方。
最后的笔记
如果您想知道,我个人的建议是不要在多线程环境中使用 PHP,如果您有选择的话!
仅谈到基于 Unix 的环境,我想说的是,如果您打算将 PHP 与 Apache Web 服务器一起使用,您只需要考虑这一点,在这种情况下,建议您使用 prefork MPM Apache(不使用线程,因此 PHP 线程安全无关紧要)和我所知道的所有 GNU/Linux 发行版在您通过其软件包系统安装 Apache + PHP 时都会为您做出决定,而无需甚至提示您做出选择。如果您打算使用其他网络服务器,例如nginx 或lighttpd,则无论如何您都无法选择将 PHP 嵌入其中。您将看到使用 FastCGI 或其他类似的东西,它在不同的模型中工作,其中 PHP 完全在 Web 服务器之外 有多个 PHP 进程用于通过例如应答请求。快速CGI。对于这种情况,线程安全也无关紧要。要查看您的网站使用的版本,请在您的网站上放置一个包含 <?php phpinfo(); ?> 的文件,然后查找 Server API 条目。这可以说是CGI/FastCGI 或Apache 2.0 Handler。
如果你也看一下 PHP 的命令行版本——线程安全并不重要。
最后,如果线程安全无关紧要,那么您应该使用哪个版本——线程安全的还是非线程安全的?坦率地说,我没有科学的答案!但我猜非线程安全版本更快和/或错误更少,否则他们只会提供线程安全版本,而不会费心给我们选择!