发布于2026-06-29 阅读(0)
扫一扫,手机访问
在线上环境中遇到 PHP-FPM 内存泄漏,机器内存被一点点蚕食,最终导致服务崩溃或响应变慢,这几乎是每位运维工程师都会碰到的棘手问题。别急,解决思路其实很清晰——从定位来源、参数调优、代码修复到工具辅助,一步步来就行。下面直接上干货。
定位内存泄漏具体从哪里来的,是首先要做的事。用几个命令就能快速摸清底细:

htop 命令(按 Shift+M 按内存排序),一眼就能看到哪些 php-fpm 进程吃内存最凶;php-fpm status(或者 Nginx/Apache 的状态页)观察进程内存使用趋势——如果每个进程的内存占用持续增长而不回落,那基本坐实了内存泄漏。既然泄漏暂时无法根除,那就从配置上限制它的影响,避免堆积成灾:
pm.max_requests:这个参数控制每个进程在处理多少请求后自动重启(比如设为 500),相当于主动释放内存。修改路径在 /etc/php-fpm.d/www.conf;pm.max_children:根据服务器内存算一个合理上限(例如服务器 8GB 内存,单个进程平均占 50MB,那 pm.max_children = 160),避免子进程太多直接撑爆内存;pm.start_servers / pm.min_spare_servers / pm.max_spare_servers:根据 CPU 核心数来定(比如 pm.start_servers = CPU核心数×4),在进程创建和销毁之间找个平衡点。配置只是治标,真正治本还得从代码下手,把泄漏点堵死:
$conn->close())、文件句柄(fclose($file))这些,用完后一定要关掉;static array)和监听器别滥用,否则对象销毁不了,垃圾回收也拿它没办法;unset() 清理变量:大数组、临时对象用完及时销毁,别让它们赖在内存里不走;如果代码是自定义的,或者怀疑第三方扩展有问题,可以用 Valgrind 这个利器精准定位:
wget http://valgrind.org/downloads/valgrind-3.16.1.tar.bz2 → tar -jxvf valgrind-3.16.1.tar.bz2 → cd valgrind-3.16.1 → ./autogen.sh → ./configure → make → sudo make install;USE_ZEND_ALLOC=0,禁用 Zend 内存管理器,让 Valgrind 检测更准确;valgrind --leak-check=full --log-file=/data/log/valgrind.log /usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf;/data/log/valgrind.log,找到类似 ==12345== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1 的提示,就能精确定位泄漏的具体文件和行号。如果一时半会儿没法彻底修复,可以先用定时重启这个“临时抱佛脚”的方案,定期释放累积的内存:
/usr/local/script/kill_php_fpm.sh:#!/bin/bash
pids=$(ps -ef | grep php-fpm | grep -v "grep" | awk '{print $2}')
if [ -n "$pids" ]; then
kill -9 $pids
fi
/usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf*/5 * * * * /usr/local/script/kill_php_fpm.sh。php.ini 中设置 opcache.enable=1,减少脚本重复编译的开销,顺带减小内存压力;php.ini 或通过 pecl 命令,把像 imagick、xdebug 这种不用的扩展关掉,降低基础内存占用;
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8