PHP-FPM的进程管理策略直接影响内存使用,需根据服务器内存和业务负载调整进程池参数(位于/etc/php/{version}/fpm/pool.d/www.conf):
(总内存 - 系统预留内存) / 单个PHP进程内存,单个进程内存可通过ps aux | grep php-fpm | awk '{print $6}'估算平均值)。例如,1GB内存服务器若单个PHP进程平均占用50MB,则pm.max_children建议设为15-20。start_servers的1-1.5倍(如start_servers=8,则min_spare=6、max_spare=12),避免频繁创建/销毁进程消耗内存。OPcache通过缓存编译后的PHP脚本,减少重复解析和编译的内存消耗(默认未启用)。配置步骤:
php.ini(位于/etc/php/{version}/fpm/php.ini),添加/修改以下参数:[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 缓存大小(MB),根据内存调整(如1GB内存设为128)
opcache.interned_strings_buffer=8 # 内部字符串缓存(MB)
opcache.max_accelerated_files=4000 # 缓存文件数量(根据项目文件数调整)
opcache.revalidate_freq=60 # 文件检查频率(秒),生产环境可设为0(禁用检查)
opcache.fast_shutdown=1 # 快速关闭,释放内存更彻底
info.php文件(<?php phpinfo(); ?>),访问后搜索“opcache”确认状态。unset()及时释放不再使用的变量(尤其是大型数组、对象);避免循环中创建大量临时变量;使用生成器(yield)处理大数据集(如数据库查询),避免一次性加载全部数据到内存。SELECT *),减少数据读取量。PHP-FPM支持三种进程管理模式,根据服务器负载选择:
pm.max_children数量的进程,适合内存充足、负载稳定的环境(如大内存服务器),无进程创建/销毁开销,性能最优。min_spare和max_spare之间),适合内存有限、负载波动的环境(如中小内存VPS),平衡性能与内存使用。pm.process_idle_timeout时间,如10秒),适合内存极小(如512MB以下)的环境,但响应速度稍慢。htop(按F6排序内存)、free -m(查看内存剩余)、ps aux | grep php-fpm | awk '{print $6/1024 " MB"}' | sort -rn(查看PHP-FPM进程内存占用)等工具,了解内存消耗情况。pm.max_requests,仍建议每周重启一次(通过crontab -e添加0 3 * * 0 systemctl restart php{version}-fpm),释放累积的内存碎片。Xdebug(生成内存分析报告)或Blackfire(可视化内存使用)定位内存泄漏点(如未释放的变量、循环引用),针对性修复。php.ini,注释掉未使用的扩展(如xdebug、soap),减少内存加载(xdebug会显著增加内存消耗,生产环境务必关闭)。fastcgi_pass从127.0.0.1:9000改为unix:/run/php/php{version}-fpm.sock,减少网络通信开销(但需确保Socket文件权限正确)。