使用带有modphp的Apache MPM prefork是因为它易于配置/安装。就性能而言,它相当低效。我首选的堆栈方式是FastCGI/PHP-FPM。这样,您可以使用更快的MPM辅助工具。整个PHP仍然是非线程的,但是Apache提供线程服务(就像它应该的那样)。
所以基本上,从下到上
Linux
PHP-FPM APC
ModFCGI不正确支持PHP-FPM或任何外部FastCGI应用程序。它只支持非进程管理的FastCGI脚本。PHP-FPM是PHP FastCGI进程管理器。
对我来说,我总是选择非线程安全版本,因为我总是使用nginx,或者从命令行运行PHP。
如果您将PHP安装为CGI二进制文件、命令行接口或其他仅使用单个线程的环境,则应使用非线程安全版本。
如果将PHP作为Apache模块安装在worker MPM(多处理模型)或其他多个PHP线程同时运行的环境中,则应使用线程安全版本。
不同的web服务器实现不同的技术来并行处理传入的HTTP请求。一种非常流行的技术是使用线程——也就是说,web服务器将为每个传入的请求创建/专用一个线程。ApacheHTTPWeb服务器支持处理请求的多个模型,其中一个(称为worker MPM)使用线程。但它支持另一种称为prefork MPM的并发模型,该模型使用进程——也就是说,web服务器将为每个请求创建/专用一个进程。
还有其他完全不同的并发模型(使用异步套接字和I/O),以及将两个甚至三个模型混合在一起的模型。为了回答这个问题,我们只关注上面的两个模型,并以ApacheHTTP服务器为例。
PHP本身不响应实际的HTTP请求——这是web服务器的工作。因此,我们将web服务器配置为将请求转发给PHP进行处理,然后接收结果并将其发送回用户。用PHP链接web服务器有多种方法。对于Apache HTTP服务器,最流行的是“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网络服务器上使用PHP,你只需要想到这一点,在这种情况下,建议你使用Apache的prefork MPM(不使用线程,因此,PHP线程安全并不重要),我所知道的所有GNU/Linux发行版都会在您通过他们的包系统安装Apache PHP时为您做出决定,甚至不会提示您选择。如果你打算使用其他的网络服务器,如nginx或light ttpd,你将没有选择嵌入PHP到他们无论如何。您将看到使用FastCGI或类似的东西,在不同的模型中工作,其中PHP完全在Web服务器之外,多个PHP进程用于通过例如响应请求。FastCGI.对于这样的情况,线程安全也不重要。要查看您的网站正在使用的版本,请将包含的文件放入
如果您也看一下PHP的命令行版本——线程安全并不重要。
最后,如果线程安全不重要,那么应该使用哪个版本——线程安全还是非线程安全?坦白说,我没有一个科学的答案!但是我猜非线程安全的版本更快和/或更少的bug,否则他们只会提供线程安全的版本,而不会费心给我们选择!
本文向大家介绍如何理解Java中的StringBuffer是线程安全的而StringBuilder是非线程安全的?,包括了如何理解Java中的StringBuffer是线程安全的而StringBuilder是非线程安全的?的使用技巧和注意事项,需要的朋友参考一下 StringBuffer(线程安全) StringBuffer是线程安全的,这意味着它们具有同步方法来控制访问,因此一次只有一个线程可以
我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢
问题内容: 我看过的利弊一些文章,并在Java编程语言。在其中一篇文章中,作者提到: StringBuilder 不是 线程安全的 ,因此在 多个线程中 使用 StringBuffer 。 不幸的是,我不明白这意味着什么。你能解释一下之间的区别,以及特别是在“线程安全”的环境。 如果您可以使用代码示例进行描述,我将不胜感激。 问题答案: 如果多个线程正在修改a的相同实例,则结果可能是意外的- 即某
本文向大家介绍KafkaConsumer是非线程安全的,那么怎么样实现多线程消费?相关面试题,主要包含被问及KafkaConsumer是非线程安全的,那么怎么样实现多线程消费?时的应答技巧和注意事项,需要的朋友参考一下 1.在每个线程中新建一个KafkaConsumer 2.单线程创建KafkaConsumer,多个处理线程处理消息(难点在于是否要考虑消息顺序性,offset的提交方式)
在我的应用程序中,我使用多个线程来处理客户端连接。 我在调试时发现了一个非常奇怪的行为——我有一个SelectionKey,通过调用(使用调试器)它的interestTops()方法,返回值是1(READ),但当我将数据发送到与该键对应的套接字时,选择器不会被唤醒。。 如果使用调试器,我将特定选择键更改为1(即使是1),选择器会突然对该更改做出反应。 在给定的时间内,我只有一个线程处理一个连接,但
问题内容: 请用代码示例说明为什么SimpleDateFormat不是线程安全的。这节课有什么问题? 是SimpleDateFormat的格式功能问题吗?请提供一个在课堂上演示此错误的代码。 FastDateFormat是线程安全的。为什么?SimpleDateFormat和FastDateFormat有什么区别? 请用代码说明这个问题? 问题答案: 将中间结果存储在实例字段中。因此,如果两个线程