作为一个phper,我们都可以很简单部署自己的lnmp,但是对与php-fpm的实现原理却很少去关注,以下是我对php-fpm的见解,若有错误,请指出。
要去理解php-fpm,我们得先去了解一下概念。
cgi:公共网关接口,是实现php与nginx有效沟通的桥梁,但是有个缺点,每有一个请求都需要新建一个进程去处理,处理后关闭。进程启动需要很大的开销,造成资源的浪费。
fastcgi:是cgi的优化版,即常驻型的cgi,开始时fastcgi进程管理器启动多个php-cgi解析器子进程等待请求的连接,避免了每次请求都需要执行加载配置,加载扩展,初始化进程等一系列操作。缺点是因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解析器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。
php-cgi:PHP实现的自带的cgi程序,只能处理请求。缺点是,php-cgi变更php.ini配置后,需重启php-cgi才能让新的php-ini生效,不可以平滑重启。而杀死php-cgi,php程序就不能运行了。
php-fpm:php-cgi的进程管理工具,他负责管理一个进程池,来处理来自Web服务器的请求。能支持修改php.ini后的平滑重启。
以下图来简单说明
php-fpm配置的几个重要指标
emergency_restart_threshold = 10 #在指定的一段时间内,如果失效的PHP-FPM子进程数超过这个值,PHP-FPM主进程将优雅重启。
emergency_restart_interval = 1m #设定emergency_restart_interval 设置采用的时间跨度。
pm = dynamic #选择进程池管理器如何控制子进程的数量 static: 对于子进程的开启数路给定一个锁定的值(pm.max_children) dynamic: 子进程的数目为动态的,它的数目基于下面的指令的值(以下为dynamic适用参数)
pm.max_children = 16 #同一时刻能够存货的最大子进程的数量
pm.start_servers = 4 #在启动时启动的子进程数量
pm.min_spare_servers = 2 #处于空闲"idle"状态的最小子进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建
pm.max_spare_servers = 16 #最大空闲子进程数量,空闲子进程数量超过这个值,那么相应的子进程会被杀掉。
pm.max_request = 500 # 指的是进程达到多少请求后重启
控制php-cgi的进程数能有效的提高并发量,要注意避免内存的问题,因为进程的数目提升也代表内存的增多,那么如何配置一个合理的子进程数呢
- dynamic模式: [cpuNum + 20%, M/m] ,其中M与m分别代表PHP 能利用的内存数量与每个 PHP 进程平均使用的内存数量
- static模式:M/(m * 1.2),其中M与m分别代表PHP 能利用的内存数量与每个 PHP 进程平均使用的内存数量