php-cgi和php-fpm有什么关系?
链接:https://www.zhihu.com/question/55835080/answer/146530197
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
php-cgi不是FastCGI进程管理器,php-fpm才是.
要对php-cgi进程进行管理,需要使用特别的模块:
比如Apache的mod_fcgid,IIS的PHP Manager.
而Nginx只负责反向代理/请求转发,不负责管理php-cgi进程,所以Nginx一般配合能够自行管理工作进程(子进程)的php-fpm使用.
需要注意的是,php-fpm是一个独立的SAPI,其管理的不是php-cgi,也就是说php-fpm跟php-cgi无关,php-fpm内置php解释器,php-fpm的子进程是自己fork出来的,并不会调用php-cgi,你把系统中的php-cgi删了也不会影响到php-fpm服务的正常运行.
php-fpm在pm = static配置下工作进程常驻后台,也就是如果你配置了5个工作进程pm.max_children = 5,那php-fpm服务启动时就会自动fork出5个子进程并常驻后台,不会在请求处理结束后退出,也不会在空闲时退出.如果你在php脚本中使用了数据库持久连接,这时这5个工作进程还会建立并维持5个到数据库的持久连接,实现在处理多个请求的时候重用数据库连接资源,避免每个请求都建立/释放一次数据库连接.持久连接还能做到超时自动重连,对php-fpm里的脚本来说是完全透明的,脚本只需在启动时指明使用持久连接即可.
php-fpm在pm = dynamic配置下工作进程【部分】常驻后台,也就是维持一定数量的常驻进程,服务繁忙时fork出更多的进程,服务闲置时自动关掉一些进程,把内存资源归还给操作系统.虚拟主机提供商应该是比较喜欢这种方式的.
总而言之,PHP-FPM这种运行模式类似于Apache的prefork MPM,能静能动的多进程网络服务.
[root@master php]# which php-fpm
/usr/local/php/sbin/php-fpm
[root@master php]# which php-cgi
/usr/bin/php-cgi
这两个都是php-FastCGI的管理器,可以看出这两个的路径不一样,php-cgi是PHP出的一个管理器,很烂,php-fpm是专门开发出的一个管理器,功能齐全而且强大。
这是php-fpm是独立的,这是它的官网:
http://php-fpm.org/
php-cgi是早期php官方出品的fastcgi管理器,不支持平滑重启,改了php.ini就要kill掉原来的php-cgi再重新启动才能生效;不支持动态worker调度,只能一开始指定要起几个worker。
php-fpm是从5.3.3才加入的fastcgi进程管理器,加入了动态调度功能,可以根据请求来访压力变化动态增减worker进程数量;支持reload指令,让worker进程在完成当前请求后重启,并应用php.ini新配置。