首页 > PHP的进程问题

PHP的进程问题

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


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


拿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扩展,则是一个多进程程序。否则正常情况下,就是一个单进程的程序。


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


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

【热门文章】
【热门文章】