我理解PHP支持处理多个并发连接,并且根据服务器的不同,可以按照answer
中的说明进行配置服务器如何管理多个连接是为每个请求分配子进程还是使用线程处理它还是使用线程池进行处理?
linked answer表示进程是分叉的,然后评论中的作者说线程或进程,如果使用子进程,线程或线程池提供请求,这会让人感到困惑?
答案 0 :(得分:19)
据我所知,每个网络服务器都有自己的处理多重同声请求。 通常Apache2 schould为每个新请求分叉子进程。但是您可以按照链接的StackOverflow答案中提到的方式配置此行为。
例如,Nginx获取一个线程中的每个请求(像Node.js那样异步处理新连接)或者有时使用缓存(如配置的那样; Nginx也可以用作负载均衡器或HTTP代理)。为您的应用选择合适的网络服务器是件好事。Apache2可能是一个非常好的网络服务器,但是当你想在生产中使用它时需要更多的负载平衡。但是,当它具有多个短持久连接或者甚至根本不改变(或使用缓存)的文档时,它也具有良好的能力。
Nginx非常好,如果你期望很多持久的连接,不知何故长的处理时间。那时你不需要那么多负载均衡。
我希望,我能帮助你解决这个问题;)
来源:
https://httpd.apache.org/docs/2.4/mod/worker.html
答案 1 :(得分:4)
经过一些研究后,我得出了以下结论。
重要的是要考虑如何设置PHP服务器以便能够深入了解它。如果要自己设置服务器和PHP,可能有三种可能:
1)使用PHP作为模块(对于许多服务器,PHP具有直接模块接口(也称为SAPI))
2)CGI
3)FastCGI
将Case#1 PHP视为模块,在这种情况下,模块与Web服务器本身集成,现在它将球完全放在Web服务器上,它如何处理分叉过程中的请求,使用线程,线程池等。
对于模块,Apache mod_php似乎非常常用,而Apache本身使用两个模型中的进程和线程来处理请求,如answer
中所述。Prefork MPM使用多个子进程,每个进程有一个线程 每个进程一次处理一个连接。
工人MPM使用 多个子进程,每个进程有多个线程。每个线程处理 一次一个连接。
显然,其他服务器可能采取其他方法,但我不知道相同。
对于#2和#3,Web服务器和PHP部分在不同的进程中处理,Web服务器如何处理请求以及应用程序如何进一步处理(PHP部分)会有所不同。例如:NGINX可以使用异步非阻塞I / O处理请求,Apache可以使用线程处理请求,但是,FastCGI或CGI应用程序如何处理请求是一个不同的方面,如下所述。这两个方面,即Web服务器如何处理请求以及如何处理PHP部分对于PHP服务器性能都很重要。
考虑到#2,CGI协议使得Web服务器和应用程序(PHP)相互独立,CGI协议要求应用程序和Web服务器使用不同的进程进行处理,并且协议不会促进同一进程的重用,这在转向意味着需要一个新的流程来处理每个请求。
考虑到#3,FastCGI协议通过允许进程重用来克服CGI的限制。如果您检查IIS FastCGI link FastCGI通过提供一种机制来反复为多个请求重复使用单个进程来解决CGI中固有的性能问题。
FastCGI维护与非线程安全库的兼容性 提供可重用流程池并确保每个流程 一次只处理一个请求。
也就是说,在FastCGI的情况下,服务器似乎维护一个进程池,它使用进程池来处理传入的客户端请求,因为进程池不需要线程安全检查,它提供了良好的性能。 / p>
答案 2 :(得分:3)
我认为答案取决于Web服务器和cgi的部署方式。
在我的公司,我们使用Nginx作为Web服务器,使用php-fpm作为cgi,因此并发请求由php-fpm处理为进程,而不是线程。
我们配置最大进程数,每个请求由一个php进程处理,如果有更多请求(大于最大进程数),则等待。
所以,我相信PHP本身可以支持所有这些,但是如何使用它,这取决于。
答案 3 :(得分:0)
PHP不处理请求。 Web服务器可以。
对于Apache HTTP Server
,最受欢迎的是“ mod_php”。该模块实际上是PHP本身,但是被编译为Web服务器的模块,因此可以直接在其中加载。
自从使用mod_php以来,PHP就直接加载到Apache中,如果Apache要使用其Worker MPM(即,使用 Threads )来处理并发性
对于nginx
,PHP完全在Web服务器外部,具有多个PHP 进程
有时您可以选择使用non-thread safe
或thread safe
PHP。
但是setlocale()函数(如果支持)实际上是在修改操作系统进程状态,并且不是线程安全的。
当您不确定遗留代码如何工作时,应该记住它。