PHP-FPM先来了解一些名词概念:CGI是CommonGatewayInterface(公共网络管理协议),一种用来让交互式程序与Web服务器通信的协议。它负责处理URL请求,启动一个进程,将客户端发送的数据作为输入,Web服务器收集程序的输出并添加适当的标头,然后将其发送回客户端。FastCGI是基于CGI协议的增强版。与创建新流程来服务请求不同,它使用连续流程并创建子流程来处理一系列流程。这些进程由FastCGI服务器管理,开销更小,效率更高。PHP-FPM是PHP实现的FastCGI进程管理器(FastCGIProcessManager),用于替代PHPFastCGI的大部分附加功能,适用于高负载网站。支持的功能如:平滑停止/启动高级进程管理功能慢速日志记录脚本动态/静态子进程生成基于php.ini的配置文件PHP-FPM在5.4之后已经集成到PHP源代码中以提供更好的PHP进程管理方法可以有效控制内存和进程,平滑地重新加载PHP配置。如果需要使用,只需在./configure中带上-enable-fpm参数,使用PHP-FPM控制FastCGI进程//支持start/stop/quit/restart/reload/logrotate参数//quit/reload是Smoothtermination和smoothreloading,也就是等待现有服务完成。/php-fpm--startPHP-FPM配置PHP-FPM配置文件为php-fpm.conf在这个配置文件中,我们需要了解一些参数。下面所有的子进程都是指php-fpm进程,可以在终端通过psaux|查看grepphp。显示php-fpm:poolwww的代表工作子进程(实际处理请求)显示php-fpm:processmaster的代表master主进程(负责管理工作子进程)全局配置首先看PHP-FPM最重要的全局配置部分:emergency_restart_threshold如果在emergency_restart_interval设置的时间内,FPM在收到SIGSEGV或者SIGBUS退出信号达到该参数设置的次数后会重启。默认值为0,表示关闭该功能。emergency_restart_interval设置平滑重启的时间间隔,有助于解决加速器共享内存占用问题。可用单位为s(默认)/m/h/d,默认值为0,表示关闭。process.maxFPM可以创建最大子进程数,在使用配置了pm=dynamic的多个php-fpmpool进程池时控制全局子进程数。默认值为0,表示无限制。进程池配置PHP-FPM配置的其余部分是一个称为池定义的区域。该区域的配置设置了各个PHP-FPM进程池,是一系列相关的子进程。这部分总是以[进程池名称]开头,例如[www]。至此,可以解释为psaux|grepphp显示php-fpm:poolwww.pmpm指的是进程管理器,它指定了进程管理器如何控制子进程的数量。必须,支持3个值:static:使用固定数量的子进程,由pm.max_children指定dynamic:根据以下参数动态调整子进程数量,必须至少有一个子进程:最小数量ofidlechildprocesses,如果不够,会自动创建新的子进程当一个新的请求到达时。会用到下面两个参数:pm.max_childrenpm.process_idle_timeout子进程的空闲超时时间,如果超时时间达到没有新的请求服务,就会被杀死pm.max_requests每个子进程的最大请求服务数,ifexceeded如果超过这个值,子进程会自动重启。在对第三方库中的内存泄漏进行故障排除时,此参数很有用。默认值为0,这意味着子进程可以继续为请求提供服务。PHP-FPM配置通过一个主进程、多个池进程池和多个工作子进程优化PHP-FPM管理。每个进程池监听一个socket套接字。具体说明:worker子进程实际处理连接请求,master主进程负责管理子进程:1.`master`进程,设置一个1s定时器,通过`socket`文件监听2.当`pm=dynamic`时,如果`idleworkers`的数量<`pm.min_spare_servers`,创建一个新的子进程3.当`pm=dynamic`时,如果`idleworkers`的数量>`pm.max_spare_servers`、杀死多余的空闲子进程4.当`pm=ondemand`时,如果`idleworker`idletime>`pm.process_idle_timeout`,killidleprocess5.当连接到达时,检查`worker`的数量是否>`pm.max_children`,打印warning`登录,退出;如果没有异常,使用`idleworker`服务,或者新建一个`worker`服务来保证基本的安全为了防止PHP-FPM主进程因为一些糟糕的PHP代码而挂掉,我们需要设置重启的全局配置:;如果1分钟内有10个子进程中断失效,则重启主进程emergency_restart_threshold=10emergency_restart_interval=1m进程数调优每个子进程一次只能服务一个连接,所以控制在多少个进程存在很重要同时,如果太少会导致很多不必要的重构和销毁开销,如果太多会占用太多内存,影响其他服务的使用。我们应该测试我们的PHP进程使用了??多少内存。一般来说,刚启动的时候是8M左右,运行一段时间后会因为内存泄漏和缓存等原因升到30M左右,所以需要根据你预期的内存大小来设置进程数。同时根据进程池的数量查看一个进程管理器的子进程数量的限制。测试PHP子进程平均占用内存:$psauxf|grepphp|grep-vgrepwork268290.00.07159764712?SsJul110:00php-fpm:主进程(./etc/php-fpm.conf)work218890.00.072907629668?S03:120:20\_php-fpm:池www工作212730.00.072892831380?S03:250:21\_php-fpm:池www工作151140.00.0S729084?03:400:19\_php-fpm:池www工作170720.00.072880034240?S03:540:22\_php-fpm:池www工作227630.00.072790420352?\_php-fpm:池www工作385450.00.072779619484?S12:340:01\_php-fpm:poolwww//总内存量$psauxf|grepphp|grep-vgrep|grep-v大师|awk'{sum+=$6}END{printsum}'162712//所有子进程的个数$psauxf|grepphp|grep-vgrep|grep-v大师|wc-l6可以看到前6列,每个子进程的内存使用量大概在19-34M(单位是KB)。平均内存使用量为162712KB/6=27.1M。查看服务器总内存大小$free-gtotalusedfreesharedbufferscachedMem:1571411504123-/+buffers/cache:13143Swap:000可以看出我服务器总内存大小为157G(使用-gG单位)。进程数限制这个时候如果我们把所有的内存分配给PHP-FPM使用,那么进程数可以限制在157000/27=5814,但是因为我的服务器同时服务的内容很多,我们可以调整到512个进程数:process.max=512pm=dynamicpm.max_children=512pm.start_servers=16pm.min_spare_servers=8pm.max_spare_serveres=30所以我们需要为每个子进程服务限制请求数,防止无限内存泄漏:pm.max_requests=1000重启如果以上配置根据你的实际需求和环境进行配置,不要忘记重启PHP-FPM服务.参考资料PHP手册-FastCGI:http://php.net/manual/zh/inst...Wikipedia-CGI:https://zh.wikipedia.org/wiki...Wikipedia-FastCGI:https://zh。wikipedia.org/wiki...博客园php-fpm进程号优化:https://www.cnblogs.com/52fhy...简书php-fpm进程管理:https://www.jianshu。com/p/c9a...PHP手册php-fpm.conf:http://php.net/manual/zh/inst...《Modern PHP》第7章PHP-FPM
