首先需要明确内存占用的具体情况,使用以下命令快速定位问题:
top 命令(按 M 键按内存使用排序),观察PHP-FPM进程的内存占用占比;ps -fe | grep "php-fpm" | grep "pool" | wc -l,查看当前PHP-FPM的子进程总数;ps -ylC php-fpm --sort:rss,按内存使用(RSS列)排序,查看高内存进程的启动时间和资源消耗。PHP-FPM的进程管理策略直接影响内存占用,需根据服务器资源调整/etc/php/{版本}/fpm/pool.d/www.conf中的关键参数:
pm.max_children:核心参数,控制最大子进程数。计算公式:(服务器总内存 - 系统预留内存) / 单个PHP进程平均内存(可通过ps -ylC php-fpm --sort:rss查看单个进程平均内存,单位为KB)。例如,服务器有8GB内存,系统预留2GB,单个进程平均100MB,则pm.max_children建议设置为(8192-2048)/100≈61(取整数);pm.start_servers:启动时的子进程数,建议设置为pm.max_children的1/4~1/2(如上述例子中设置为15~30);pm.min_spare_servers/pm.max_spare_servers:空闲进程的最小/最大数量,避免频繁创建/销毁进程。建议设置为pm.max_children的1/4~1/2(如15~30);pm.max_requests_per_child:每个子进程处理的最大请求数(如1000~5000)。设置后,子进程会在处理完指定请求数后自动重启,有效防止内存泄漏(即使代码无泄漏,长期运行也可能因缓存累积导致内存增长)。OPcache是PHP的字节码缓存扩展,可避免重复编译PHP脚本,显著减少内存占用并提升性能。
php.ini(/etc/php/{版本}/fpm/php.ini)中取消注释或添加以下配置:zend_extension=opcache.so opcache.enable=1 opcache.memory_consumption=128 ; 缓存内存大小(MB),根据服务器内存调整(如128~512MB) opcache.interned_strings_buffer=8 ; 内部字符串缓存大小(MB) opcache.max_accelerated_files=10000 ; 缓存的脚本文件数量 opcache.revalidate_freq=60 ; 脚本检查更新频率(秒) phpinfo.php文件(<?php phpinfo(); ?>),访问该页面查看“opcache”部分是否显示“enabled”。代码中的内存泄漏或不合理的资源使用是内存占用的根本原因之一,需通过以下方式排查优化:
mysqli_close()、fclose());避免全局变量长期持有大量数据;while循环替代递归函数)。PHP扩展会增加内存开销,需禁用未使用的扩展:
php.ini(/etc/php/{版本}/fpm/php.ini),找到Dynamic Extensions部分,注释掉不需要的扩展(如extension=gd.so、extension=mbstring.so,若项目未使用图片处理或多字节字符串功能);sudo systemctl restart php{版本}-fpm。新版本的PHP通常包含内存管理优化和性能提升(如PHP 8.x相比PHP 7.x在内存占用上有明显下降)。升级前需备份项目代码和数据库,参考Ubuntu官方文档完成升级。
htop、glances等工具实时查看内存使用情况,及时发现异常;/var/log/php{版本}-fpm.log)和慢日志(需开启slowlog参数),分析内存占用高的请求或代码;通过以上步骤,可有效降低Ubuntu下PHP-FPM的内存占用,提升服务器性能。需根据实际服务器配置和应用场景调整参数,避免盲目设置导致资源浪费或服务不稳定。