在 Ubuntu 上运行 PHP 时“内存占用高”通常不是单一原因,而是PHP 本身配置、业务代码、运行模式、系统环境叠加造成的。下面按最常见 → 较少见给你系统梳理。
Ubuntu 上 PHP 通常通过 PHP-FPM 运行。
如果配置不当:
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
每个 PHP-FPM 子进程都会常驻内存:
✅ 检查:
ps aux | grep php-fpm
✅ 优化:
pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s
memory_limit 设置过大memory_limit = 512M
即使脚本没用到,PHP 也可能预留内存。
✅ 建议:
memory_limit = 128M
Web 项目一般 128M–256M 足够。
后台任务、队列、定时任务:
php artisan queue:work
php script.php
如果:
会一直涨内存。
✅ 检查:
top -p $(pgrep -f php)
✅ 解决:
unset()例如:
$users = User::all(); // 几万条
✅ 改进:
User::chunk(1000, function ($users) {
// 处理
});
$GLOBALS['data'] = hugeArray();
PHP 请求结束才会回收。
✅ 优化:
很多人以为 OPCache 占内存,其实:
❌ 不开 → 每次重新编译 PHP
✅ 开了 → 复用内存
opcache.enable=1
opcache.memory_consumption=128
free -h
如果:
buff/cache 占用高
这是正常的 Linux 缓存,不是 PHP 泄漏。
# PHP 进程内存
ps aux | grep php-fpm
# 内存总览
free -h
# PHP 配置
php -i | grep memory_limit
# FPM 配置
/etc/php/*/fpm/pool.d/www.conf
你可以告诉我:
我可以直接帮你算最优 pm.max_children 和 memory_limit。