首页 文章

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

提问于
浏览
694

我看到PHP的不同二进制文件,如非线程或线程安全?这是什么意思?这些套餐有什么区别?

4 回答

  • 606

    并发方法背景:

    不同的Web服务器实现了并行处理传入HTTP请求的不同技术 . 一种非常流行的技术是使用线程 - 也就是说,Web服务器将为每个传入请求创建/专用一个线程 . Apache HTTP Web服务器支持多种处理请求的模型,其中一种(称为worker 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要使用其工作MPM(即使用线程)处理并发,那么PHP必须能够在同一个多线程环境中运行 - 意思是, PHP has to be thread-safe to be able to play ball correctly with Apache!

    在这一点上,你应该想"OK, so if I'm using a multi-threaded web server and I'm going to embed PHP right into it, then I must use the thread-safe version of PHP" . 这是正确的思考 . 但是,碰巧,PHP的线程安全is highly disputed . 这是一个使用 - 如果你真的知道你在做什么的基础 .

    最后的笔记

    万一你想知道,如果你有选择的话,我个人的建议就是 not 在多线程环境中使用PHP!

    说到基于Unix的环境,我使用线程,因此,PHP线程安全并不重要)我所知道的所有GNU / Linux发行版都会在您通过他们安装Apache PHP时为您做出决定包装系统,甚至没有提示您选择 . 如果您打算使用其他Web服务器,例如nginxlighttpd,则无论如何都无法将PHP嵌入其中 . 您将看到使用FastCGI或类似的东西,它们在不同的模型中工作,其中PHP完全在Web服务器之外,其中多个PHP进程用于通过例如回复请求来回答请求 . FastCGI的 . 对于这种情况,线程安全也无关紧要 . 要查看您的网站使用的版本,请在您的网站上放置包含 <?php phpinfo(); ?> 的文件,然后查找 Server API 条目 . 这可以说像 CGI/FastCGIApache 2.0 Handler .

    如果你也看一下PHP的命令行版本 - 线程安全无关紧要 .

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

  • 19

    对我来说, I always choose non-thread safe 版本因为我总是使用nginx,或者从命令行运行PHP .

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

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

  • 240

    根据PHP Documentation

    下载PHP时线程安全意味着什么?

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

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

    • SNMP(UNIX)

    • mSQL(Unix)

    • IMAP(Win / Unix)

    • Sybase-CT(Linux,libc5)

  • 28

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

相关问题