PHP-FPM的内存占用过高常与进程数量失控有关,需通过调整php-fpm.d/www.conf(或php-fpm.conf)中的进程管理参数,匹配服务器资源(内存、CPU核心数)。关键参数及调整逻辑如下:
pm.max_children:设置最大子进程数,需根据服务器内存计算(公式:(总内存 - 系统预留内存) / 单个PHP进程平均内存)。例如,服务器有4GB内存,系统预留1GB,单个PHP进程平均占用200MB,则pm.max_children建议设为(4096-1024)/200≈15(避免超过内存上限)。pm.start_servers:启动时的子进程数,建议设为CPU核心数的2-4倍(如4核CPU设为8-16),避免启动时进程过多抢占资源。pm.min_spare_servers/pm.max_spare_servers:空闲进程的最小/最大数量,建议设为CPU核心数的1-2倍(如4核CPU设为4-8),保持足够的空闲进程应对突发请求,同时避免过多空闲进程浪费内存。pm.max_requests:每个子进程处理的最大请求数(如设为500-1000),达到阈值后自动重启进程,彻底解决内存泄漏问题(即使代码有轻微泄漏,也能通过重启重置内存)。通过php.ini或www.conf限制单个PHP脚本的内存上限,防止单个脚本占用过多内存导致整体崩溃。
php.ini配置:找到memory_limit参数(常见路径:/etc/php.ini或/etc/php/7.x/fpm/php.ini),将其调整为合理值(如128M或256M,根据应用需求调整)。www.conf覆盖:若需针对特定池(如www池)设置,可在/etc/php-fpm.d/www.conf中添加php_admin_value[memory_limit] = 128M(优先级高于php.ini)。systemctl restart php-fpm)使配置生效。OPcache通过缓存编译后的PHP字节码,减少重复解析和编译的开销,显著降低内存占用并提升性能。
php -m | grep opcache,若未启用则需修改php.ini(/etc/php.ini):zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 ; 缓存大小(MB),根据内存调整
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
www.conf中添加php_admin_flag[opcache.enable_cli]=1,确保命令行和FPM均启用OPcache。内存泄漏是PHP-FPM内存持续增长的常见原因,需通过代码分析工具定位问题:
close())。gc_collect_cycles(),强制回收未引用的内存(适用于循环密集型脚本)。多余的PHP扩展会增加内存加载项,需禁用未使用的扩展:
php.ini(/etc/php.ini),注释掉不需要的扩展(如extension=php_mysql.dll、extension=php_gd2.dll,根据实际需求保留)。pecl uninstall 扩展名卸载无用扩展,减少内存消耗。新版本PHP通常包含内存管理优化和性能提升(如PHP 8.x比7.x更高效),升级到最新稳定版可显著降低内存占用。
yum update php(CentOS)或源码编译升级,升级后测试应用兼容性。定期监控PHP-FPM的内存使用情况,及时发现问题:
top、htop、glances命令查看进程内存占用(按M键按内存排序)。/var/log/php-fpm.log或/var/log/php-fpm/www-error.log,查找Out of memory、memory limit exceeded等错误,定位内存消耗大的脚本。若以上方法均无法解决,且应用确实需要更多内存(如高并发场景),则需升级服务器配置(如增加内存条),从根本上解决内存瓶颈。