PHP-FPM即PHP FastCGI 进程管理器,要了解PHP-FPM,首先要看看CGI与FastCGI的关系。
CGI的英文全名是Common Gateway Interface,即通用网关接口,是Web服务器调用外部程序时所使用的一种服务端应用的规范
早期的Web 通信只是按照客户端请求将保存在Web服务器硬盘中的数据转发过去而已,这种情况下客户端每次获取的信息也是同样的内容(即静态请求,比如图片、样式文件、HTML文档),而随着Web 的发展,Web所能呈现的内容更加丰富,与用户的交互日益频繁,比如博客、论坛、电商网站、社交网络等。
这个时候仅仅通过静态资源已经无法满足Web通信的需求,所以引入CGI以便客户端请求能够触发Web服务器运行另一个外部程序,客户端所输入的数据会传给这个外部程序,该程序运行结束后会将生成的HTML和其他数据通过Web服务器再返回给客户端(即动态请求,比如基于PHP、Python、Java实现的应用)。利用CGI可以针对用户请求动态返回给客户端各种各样动态变化的信息。
FastCGI顾名思义,是CGI的升级版本,为了提升CGI的性能而生,CGI针对每个HTTP请求都会fork一个新进程来进行处理(解析配置文件、初始化执行环境、处理请求),然后把这个进程处理完的结果通过Web 服务器转发给用户,刚刚fork的新进程也随之退出,如果下次用户再请求动态资源,那么Web服务器又再次fork一个新进程,如此周而复始循环往复
而FastCGI则会先fork一个master进程,解析配置文件,初始化执行环境,然后再fork多个worker进程(与Nginx有点像),当HTTP请求过来时,master进程会将其传递给一个worker进程,然后立即可以接收下一个请求,这样就避免了重复的初始化操作,效率自然也就提高了。而且当worker进程不够用时,master进程还可以根据配置预先启动几个worker进程等着;当空闲worker进程太多时,也会关掉一些,这样不仅提高了性能,还节约了系统资源。
这样一来,PHP-FPM就好理解了,FastCGI只是一个协议规范,需要每个语言具体去实现,PHP-FPM就是PHP版本的FastCGI协议实现,有了他,就是实现PHP脚本与Web服务器(通常是Nginx)之间的通信,同时他也是一个PHP SAPI,从而构建起PHP 解释器与Web 服务器之间的桥梁。
PHP-FPM负载管理一个进程池来处理来自Web服务器的HTTP动态请求,在PHP-FPM中,master进程负责与Web服务器进行通信,接收HTTP请求,再将请求转发给worker进程进行处理,worker进程主要负责动态执行PHP代码,处理完成后,将处理结果返回给Web服务器,再由Web服务器将结果发送给客户端。这就是PHP-FPM的基本工作原理,
PS:最大请求数:最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的
这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。
pm.max_requests =10240
