php-fpm
php-fpm是个中间件,在需要php解释器来处理php文本时会用到php-fpm
。自php5.3.3
以后就将php-fpm集成在php内核中。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。
相关概念
1、CGI
CGI(common gateway interface )通用网关接口,是webserver和web应用程序交流时的一组接口规范。
2、Fast-cgi
FastCGI可以理解为一种协议,用于web服务器(nginx,Apache)和处理程序间进行通信,是一种应用层通信协议。是cgi协议的升级版
fast-cgi每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新fork一个进程了,从而避免了每个请求进程创建和终止的开销,大大提高了效率。
3、Php-cgi
php-cgi是一个进程。php-cgi实现了cgi协议,但是它是单进程的,一个进程处理一个请求,处理结束后进程就自我销毁。
4、Php-fpm
是对php-cgi的改进版,它直接管理多个php-cgi进程/线程。也就是说,php-fpm是php-cgi的进程管理器,因此它算是fastcgi协议的实现。在一定程度上讲,php-fpm与php的关系,和tomcat对java的关系是类似的.
5、cgi进程/线程:
在php上,就是php-cgi进程/线程。专门用于接收web server的动态请求,调用并初始化zend虚拟机。
6、cgi脚本:
被执行的php源代码文件。
7、zend虚拟机:
对php文件做词法分析、语法分析、编译成opcode,并执行。最后关闭zend虚拟机。
8、cgi进程/线程和zend虚拟机的关系:
cgi进程调用并初始化zend虚拟机的各种环境。
9、cgi、fastcgi、php-cgi和php-fpm之间的关系
web server对cgi进程/线程来说,它的作用就是发起动态处理请求,传递一些参数和环境变量,最后接收cgi的返回结果。通俗点说就是当接收到一个请求时,webserver临时启动一个cgi解释器,并通过cgi协议转发要运行的内容。当cgi脚本运行结束后,将结果返回给webserver,然后cgi解释器进程自我销毁。假如有10000个请求进来,那么就会先后启动10000个cgi解释器,这种方法效率极低。
php-fpm工作原理
php-fpm的管理对象是php-cgi进程
1.master进程
php-fpm是一种多进程的模型,由一个master进程和若干worker进程组成(具体数量需要看php-fpm.conf的配置),master不会处理请求,而是fork出worker子进程去接受和处理请求
master进程的主要作用就是管理worker进程,负责fork或者kill掉子进程。在启动时根据配置文件会预先启动一定数量的php-fpm进程。当请求比较多worker处理不过来时,master会fork新的worker进程处理。如果空闲的进程较多时,就会kill掉一些worker进程,避免占用浪费系统资源。
2.worker进程
worker进程的主要工作是处理请求,每个worker进程都会accept请求,接受成功后会解析fastcgi,然后执行脚本,完成后关闭请求,继续等待新的连接。