Ubuntu下PHP-FPM内存占用高的解决方法
在Ubuntu服务器上跑PHP,最让人头疼的莫过于内存突然飙升,一个PHP-FPM进程就把整台机器拖垮。别慌,其实背后就那么几个原因,咱们一步步排查、优化,完全能搞定。
1. 排查内存占用现状
先搞清楚内存到底占了多少,别盲目猜。用下面几个命令,一分钟就能摸清底细:

- 用
top命令,然后按M键按内存排序,直观看到PHP-FPM进程的占比; - 统计子进程总数:
ps -fe | grep "php-fpm" | grep "pool" | wc -l; - 分析单个进程的内存消耗:
ps -ylC php-fpm --sort:rss,重点看RSS列,找出那些“吃内存大户”的启动时间和资源消耗。
2. 优化PHP-FPM进程池配置
PHP-FPM的进程管理策略,直接决定了内存占用水平。核心配置文件在 /etc/php/{版本}/fpm/pool.d/www.conf,以下参数需要根据服务器实际情况调整:
- pm.max_children:最大子进程数。计算公式很简单:
(服务器总内存 - 系统预留内存) / 单个PHP进程平均内存。比如8GB内存的服务器,系统预留2GB,单个进程平均100MB,那建议设为(8192-2048)/100≈61(取整)。单个进程平均内存可以通过ps -ylC php-fpm --sort:rss查看RSS列,单位是KB; - pm.start_servers:启动时的子进程数,建议设为
pm.max_children的1/4~1/2。上例中15~30比较合适; - pm.min_spare_servers / pm.max_spare_servers:空闲进程的最小/最大数量,同样建议设为1/4~1/2,避免频繁创建销毁进程带来的开销;
- pm.max_requests_per_child:每个子进程处理的最大请求数(比如1000~5000)。这个参数很关键——即使代码没有内存泄漏,长期运行的进程也会因缓存累积而膨胀。设置后,子进程处理完指定请求数就会自动重启,有效防止内存持续增长。
3. 启用并配置OPcache
OPcache是PHP的字节码缓存,能避免重复编译PHP脚本,既减少内存占用又提升性能。Ubuntu系统默认包含OPcache,只需在 /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 文件(内容为 ),访问后查看“opcache”部分是否显示“enabled”即可确认。
4. 优化PHP代码
代码层面的内存泄漏或资源滥用,才是内存占用的根本原因。可以借助性能分析工具(如Xdebug、Blackfire)定位内存消耗高的函数或循环——比如未释放的大数组、无限递归、重复加载大型文件。另外,务必确保数据库连接、文件句柄等资源在使用后及时关闭(mysqli_close()、fclose()),避免全局变量长期持有大量数据。循环和递归也要优化,能用迭代就别用递归,比如用 while 替代递归函数会友好得多。
5. 关闭不必要的PHP扩展
每个PHP扩展都会增加内存开销。编辑 php.ini,找到 Dynamic Extensions 部分,注释掉那些项目未使用的扩展(比如 extension=gd.so、extension=mbstring.so,如果项目不需要图片处理或多字节字符串功能)。改完后重启PHP-FPM:sudo systemctl restart php{版本}-fpm。
6. 升级PHP版本
新版PHP通常包含内存管理优化和性能提升,比如PHP 8.x相比PHP 7.x在内存占用上有明显下降。升级前别忘了备份项目代码和数据库,参考Ubuntu官方文档操作即可。
7. 监控与持续优化
- 实时监控:用
htop、glances等工具随时查看内存使用情况,发现异常立刻定位; - 日志分析:定期检查PHP-FPM日志(
/var/log/php{版本}-fpm.log)和慢日志(需开启slowlog参数),从中找出内存占用高的请求或代码; - 负载均衡:如果单台服务器实在扛不住流量,可以考虑用Nginx负载均衡,把请求分发到多台PHP-FPM服务器,减轻单机压力。
通过以上步骤,一般都能把Ubuntu下PHP-FPM的内存占用压下来。当然,具体参数还得根据实际服务器配置和应用场景微调,切忌盲目照搬,否则可能资源浪费或服务不稳定。