为什么你的网站总是出现 “Allowed memory size exhausted”?
在 WordPress 运维过程中,几乎所有站长都遇到过这样一条报错:
Fatal error: Allowed memory size exhausted
大多数人的第一反应是:把 memory_limit 调大。
但现实是——很多人从一开始就理解错了 PHP 的内存机制。
这篇文章将从底层运行原理出发,彻底讲清:
PHP memory_limit 真正限制的是什么
为什么它不是服务器总内存
WordPress 的 WP_MEMORY_LIMIT 与 WP_MAX_MEMORY_LIMIT 如何工作
为什么你修改了配置却仍然报错
一、PHP memory_limit 的真实含义
很多人认为:
memory_limit = 256M
代表服务器 PHP 总共只能使用 256MB 内存。
这是一个典型误区。
memory_limit 是“单请求限制”
在 PHP 的运行模型中(无论 PHP-FPM 还是 Apache Module):
每一个 HTTP 请求都会分配给一个独立的 PHP Worker 进程执行。
因此:
memory_limit 是针对单个请求的限制。
它限制的是:
当前脚本执行过程中产生的变量、对象、缓存等占用
脚本运行时的瞬时内存使用量
它并不是:
所有 PHP 程序的总内存
某个 PHP 文件大小限制
整台服务器的统一额度
可以这样理解:
每个请求都是一个独立士兵,memory_limit 就是他手里的那只碗。
二、真正的服务器压力:内存乘法效应
服务器的真实内存压力来自:
memory_limit × 并发数
例如:
memory_limit = 128M
PHP-FPM 最大 Worker = 50
理论最大消耗:
50 × 128MB ≈ 6.25GB
这就是为什么不能盲目调大 memory_limit。
如果服务器只有 8GB 内存,而你设置:
memory_limit = 1G
只需要 8 个高负载请求同时进入:
Linux 会触发 OOM(内存耗尽)
系统开始杀进程
网站直接宕机
memory_limit 越大,并不代表网站越稳定。
三、CLI 模式的特殊性
当你通过命令行运行 PHP 时,例如:
WP-CLI
数据导入脚本
队列处理任务
Laravel Artisan
每一个 CLI 实例都会获得独立 memory_limit。
CLI 默认通常为:
memory_limit = -1
即无限制。
原因是 CLI 不存在 Web 高并发压力,并且经常需要处理大量数据。
四、PHP 统计的“内存”包含什么?
PHP 报错中的内存,并不等同于系统真实内存。
会计入 memory_limit 的内容
主要包括:
PHP 变量、数组、对象(最大来源)
数据库查询结果集
图片处理(GD / Imagick)
文件读取缓存
输出缓冲区
例如:
$rows = $wpdb->get_results(…);
一次读取大量数据时,内存会迅速上涨。
不计入 memory_limit 的内容
以下资源不会计算在内:
PHP 解释器自身占用
OPcache 共享内存
Web Server 占用
exec() 调用的系统程序
因此可能出现:
系统监控显示内存正常,但 PHP 依然报内存不足。










暂无评论内容