ChatGPT解决这个技术问题 Extra ChatGPT

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

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

这是什么意思?

这些包有什么区别?

您可以在 en.wikipedia.org/wiki/Thread_safety 关于 PHP 上阅读有关线程安全的信息:Is PHP thread-safe Don't Believe The Lies: PHP Isn't Thread-Safe Yet Difference between PHP thread safe and non thread safe binarie 有大量可用资源。在 Stackoverflow 或 Google 上搜索。

C
Community

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

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

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

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


那么 PHP-FPM 不是线程化的吗?这解决了问题,因为在 nginx 服务器上使用了 Fast CGI。
很棒的细节,我多年来一直在使用 PHP 编程,但从来不知道这一点。
@Xeoncross:通常这是正确的,实际上这是在 Apache 之外管理 PHP 进程的重要原因之一。我在回答中讨论了这方面。
只是为了清楚起见,当您说“线程安全无关紧要”时,这是否意味着我应该在这种情况下安装 PHP 的“非线程安全”版本?
PHP 的线程安全是否仍然“备受争议”(在 2015 年和第 7 版中)?
G
Greg

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

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

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


greg 你的答案应该是:“如果你想将 PHP 安装为一个 Apache 模块,其中 worker 是 MPM,应该使用线程安全版本”
那么windows上xampp附带的php是NTS还是TS?
如果你使用 PHP 内置的 web 服务器呢?使用哪种 PHP 变体以获得最佳性能?
@Dario我认为那只是Windows。
@ChristopherShaw伙计,答案仅包含意见。没有任何来源或理由将 ZTS 与 Apache 模块结合使用。它不是一个有效的答案。即使是 217 ppl 也可能是错误的 m8。
P
Peter Mortensen

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


C
Community

根据 PHP Documentation

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

线程安全意味着二进制文件可以在多线程网络服务器上下文中工作,例如 Windows 上的 Apache 2。线程安全通过在每个线程中创建一个本地存储副本来工作,这样数据就不会与另一个线程发生冲突。那我该怎么选?如果您选择将 PHP 作为 CGI 二进制文件运行,则不需要线程安全,因为每次请求都会调用该二进制文件。对于多线程网络服务器,例如 IIS5 和 IIS6,您应该使用 PHP 的线程版本。

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

SNMP (Unix)

mSQL (Unix)

IMAP (Win/Unix)

Sybase-CT (Linux, libc5)