温馨提示×

ubuntu php为何内存占用高

小樊
41
2026-09-28 13:30:03
栏目: 编程语言

在 Ubuntu 上运行 PHP 时“内存占用高”通常不是单一原因,而是PHP 本身配置、业务代码、运行模式、系统环境叠加造成的。下面按最常见 → 较少见给你系统梳理。


一、最常见原因(80% 情况)

1️⃣ PHP-FPM 进程数太多(最常见)

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 子进程都会常驻内存:

  • 一个进程 30–80MB
  • 100 个进程 ≈ 3–8GB

✅ 检查:

ps aux | grep php-fpm

✅ 优化:

pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s

2️⃣ memory_limit 设置过大

memory_limit = 512M

即使脚本没用到,PHP 也可能预留内存。

✅ 建议:

memory_limit = 128M

Web 项目一般 128M–256M 足够。


3️⃣ CLI 脚本常驻 / 死循环

后台任务、队列、定时任务:

php artisan queue:work
php script.php

如果:

  • 不退出
  • 内存没释放
  • 数组越积越多

会一直涨内存。

✅ 检查:

top -p $(pgrep -f php)

✅ 解决:

  • 使用 unset()
  • 分批处理
  • CLI 脚本设内存上限

二、代码层面的原因

4️⃣ 一次性加载大量数据

例如:

$users = User::all(); // 几万条

✅ 改进:

User::chunk(1000, function ($users) {
    // 处理
});

5️⃣ 全局变量 / 单例滥用

$GLOBALS['data'] = hugeArray();

PHP 请求结束才会回收。


6️⃣ 框架本身较重

  • Laravel / Symfony
  • 每个请求都加载大量类

✅ 优化:

  • OPcache
  • 路由缓存
  • 配置缓存

三、Ubuntu 系统层面

7️⃣ OPCache 没开(反而更费内存)

很多人以为 OPCache 占内存,其实:

❌ 不开 → 每次重新编译 PHP
✅ 开了 → 复用内存

opcache.enable=1
opcache.memory_consumption=128

8️⃣ 系统缓存被误认为 PHP 占用

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

五、如果你愿意,我可以进一步帮你

你可以告诉我:

  1. PHP 版本(7.4 / 8.1 / 8.2?)
  2. 运行模式(FPM / CLI / Apache?)
  3. 框架(Laravel / 原生 / ThinkPHP?)
  4. 内存大概多少、什么时候涨

我可以直接帮你算最优 pm.max_children 和 memory_limit。

0 踩