Home  >  Article  >  Backend Development  >  nginx - PHP的进程问题

nginx - PHP的进程问题

WBOY
WBOYOriginal
2016-06-06 20:21:351161browse

有人说PHP单进程的,我理解的单进程就是同时只能处理一个文件如果并发需要排队,PHP到底是多个进程单进程的?
如果是单进程为什么会出现下面这些问题?
1.http://segmentfault.com/q/1010000002951092
2.http://segmentfault.com/q/1010000003975704
又提过一个这个贴子说多进程的
http://segmentfault.com/q/1010000002998618

回复内容:

有人说PHP单进程的,我理解的单进程就是同时只能处理一个文件如果并发需要排队,PHP到底是多个进程单进程的?
如果是单进程为什么会出现下面这些问题?
1.http://segmentfault.com/q/1010000002951092
2.http://segmentfault.com/q/1010000003975704
又提过一个这个贴子说多进程的
http://segmentfault.com/q/1010000002998618

拿PHP-FPM来说吧,PHP-FPM是一个多进程架构的服务,一个工作进程(子进程)在同一时刻只能处理一个请求,也就是说,如果你只开启了一个工作进程(pm.max_children = 1),这时来了2个请求,那么这2个请求是按时间先后被这个工作进程处理的。建议看看我总结的PHP FastCGI进程管理器PHP-FPM的架构, 利用PHP-FPM提供的池的隔离性,分离计算密集和I/O密集操作,减少阻塞对整个PHP应用的影响。

又比如Linux上2.4系列的Apache,默认的event MPM是一个多进程多线程epoll事件驱动的架构,PHP需要编译成线程安全(--enable-maintainer-zts)版本,才能跟Apache event MPM协作。这种情况下,Apache的工作进程(多个)里的线程(多个)会调用PHP解释器libphp5.so、libphp7.so处理请求,对于一个线程里的PHP解释器来说,在同一时刻只能处理一个请求,这点依旧是不变的。另外,Windows上Apache的winnt MPM也是一个多线程(不过是单进程)架构,PHP工作原理类似。

至于命令行里的PHP,如果你使用了swoole扩展,因为swoole自身就提供了一套多进程多线程事件驱动的架构,这时就是多线程的。如果编程者调用了pthreads扩展,这时也是一个多线程程序。如果调用了pcntl扩展,则是一个多进程程序。否则正常情况下,就是一个单进程的程序。

单独的PHP程序是单进程的,也正如你说的同时只能处理一个请求,其他请求要排队。正因如此,服务器软件(如Apache等)为了保证并发,会开起多个PHP进程同时处理请求。FastCGI php-fpm也是开始多个php进程来处理请求的。
另外,在IIS等服务器软件里,还有一种多线程PHP模式,通过开设线程的方法来并发处理请求。

具体来说是那种模型需要看使用的是哪个SAPI,比如说在Apache中,那么就可能使用多线程模型, 也可能使用多进程模型。而php-fpm使用的就是多进程模型。


转自:《深入理解php内核》
第八章 线程安全 » 第二节 线程,进程和并发
http://www.php-internals.com/book/?p=chapt08/08-02-thread-process-and-concurrent

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn