当前位置: 首页 > 后端技术 > PHP

PHP-FPM和CGI的理解,以及并发响应

时间:2023-03-30 02:33:32 PHP

本文中的一些更正可以参考这篇文章:http://www.cppblog.com/woaido...先搞清楚php-fpm的关系withcgiCGICGI是web服务器和cgi程序(这里可以理解为php解释器)之间的数据传输协议,它保证了标准数据的传输。PHP-CGIphp-cgi是一个php解释器,也就是上面说的cgi程序。FastcgiFastcgi是一种用于提高cgi程序(php-cgi)性能的解决方案/协议。cgi程序的性能问题在哪里?“PHP解析器将解析php.ini文件并初始化执行环境”,就是这样。标准CGI会为每个请求执行这些步骤,因此处理时间会更长。Fastcgi会先启动一个master进程,解析配置文件,初始化执行环境,然后启动多个worker进程。当请求进来时,master将其传递给worker,然后worker可以立即接受下一个请求。这样就避免了重复劳动,效率自然提高了。而当worker不够时,master可以根据配置预先启动几个worker等待;当然,当空闲的worker过多时,会停止一些,这样既提高了性能又节省了资源。这就是Fastcgi的进程管理。PHP-FPM  上面说到Fastcgi只是一种方案或者协议,那么php-fpm就是实现Fastcgi的程序,也就是说上面说的进程分配和管理都是由FPM来完成的。FPM的官方解释是Fastcgi进程管理器(FastcgiProcessManager)。PHP对并发访问的处理过程和线程PHP在代码层面不支持多线程操作,不能像Java、C#等语言一样编写多线程代码。但是多线程和并发没有直接关系。多线程只是在代码运行时同时执行多个线程任务,以提高服务器CPU的利用率,提高代码效率。但是php可以被多个进程执行。上面提到的FPM进程管理机制是多进程单线程的,有效的提高了并发访问的响应效率。简单web服务器+php-fpm模式客户端发送请求时,web服务器会通过一个php-fpm进程(这里和下面所说的fpm进程是fpm启动的worker进程,关于fpm的工作原理这里没有不再重复)来执行php代码,php代码的执行是单线程的。然后,当多个客户端同时(并发)发送请求时,web服务器会通过php-fpm为每个请求开启一个单独的进程来执行php代码。请求执行后,空闲的php-fpm进程被销毁,内存被释放。但是并发的问题是在某个时候,客户端请求php-fpm进程数达到最大限制。这时候新的请求只能等待空闲的php-fpm进程处理。这是多进程同步阻塞模式的缺点,当然也有进程过多导致的内存占用问题。参考链接:https://www.zhihu.com/questio...phpfpm进程数和并发数有什么关系?https://segmentfault.com/q/10...PHP不支持多线程,就不用考虑并发问题?http://bbs.csdn.net/topics/39...PHP是单线程的,如何处理大量的http访问?#9层回答https://www.cnblogs.com/scott...PHP线程、进程和并发https://segmentfault.com/q/10...搞不懂FastCgi和PHP之间是什么-fpmhttp://php.net/manual/zh/inst...FastCGI进程管理器(FPM)https://www.cnblogs.com/Perki...多线程(一)高并发与多线程的关系