PHP-FPM的进程管理模式(pm)直接影响内存占用,需根据服务器内存大小选择:
dynamic(动态模式),通过合理设置pm.max_children(最大子进程数)、pm.start_servers(启动时子进程数)、pm.min_spare_servers(最小空闲子进程数)、pm.max_spare_servers(最大空闲子进程数)控制进程数量。例如1GB内存服务器可设置为:pm.max_children=15(避免过多进程占满内存)、pm.start_servers=8(启动时8个进程)、pm.min_spare_servers=6(空闲时最少6个)、pm.max_spare_servers=12(空闲时最多12个),防止进程频繁创建销毁消耗资源。ondemand(按需模式),进程仅在请求到来时启动,闲置超过pm.process_idle_timeout(如10秒)则自动终止,优先节省内存。pm.max_children数量的进程,避免动态调整的开销,但需确保内存足够承载所有进程。通过php.ini中的memory_limit参数限制单个PHP脚本的最大内存占用,避免单个脚本耗尽内存。例如设置为memory_limit=128M(根据应用需求调整,一般128M-256M足够),若应用需要更高内存可适当增加,但需避免设置过大。
OPcache通过缓存编译后的PHP字节码,减少重复编译的开销,降低内存使用并提高性能。需安装并启用:
sudo yum install php-opcache(CentOS默认仓库);/etc/php.ini,添加或修改[opcache] section:zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 缓存大小(MB),根据内存调整
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000 # 缓存的文件数量
opcache.revalidate_freq=60 # 文件更新检查频率(秒)
opcache.fast_shutdown=1 # 快速关闭
sudo systemctl restart php-fpm。内存泄漏是PHP-FPM内存占用高的常见原因,需通过以下方式修复:
unset()函数及时释放不再使用的变量(如大数组、数据库连接);SELECT * FROM large_table),改用分块查询(PDO::FETCH_ASSOC配合while循环逐行处理);yield)处理大型数据集,减少内存占用;pm.max_requests参数设置单个子进程处理的最大请求数,达到该值后进程会自动重启,释放内存。例如设置为pm.max_requests=500(小内存服务器可设为300-500),避免长期运行的进程因内存泄漏导致内存占用持续增长。
使用工具实时监控PHP-FPM内存占用,及时发现问题:
top(按M排序内存)、htop(更直观)、glances(综合监控);www.conf中启用pm.status_path = /status,通过curl http://localhost/status查看进程内存分布;/var/log/php-fpm/error.log,查找内存相关的错误或警告(如“Allowed memory size exhausted”)。若以上优化仍无法满足需求,且应用确实需要更多内存,可考虑升级服务器内存(如从1GB增至2GB或更高),从根本上解决内存不足问题。
通过以上方法组合优化,可有效降低CentOS下PHP-FPM的内存占用,提升服务器稳定性和性能。需根据实际服务器配置和应用场景调整参数,避免过度优化导致性能下降。