WordPress 内存超限与 500 错误
先拿到那行报错,再谈调多少
「Allowed memory size exhausted」和「500 Internal Server Error」经常被当成同一件事,其实是两个层级:前者是 PHP 明确告诉你内存不够了,后者是服务器只说「出错了」,什么原因都不给。前者的处理路径很清晰,后者要先想办法把真实错误挖出来。这一页讲清楚这两种情况怎么区分、报错里的数字怎么读、上限该调到多少,以及调完之后为什么还会复发。
报错里的数字在说什么
字节换算过来就明白了
PHP 的内存报错格式固定,读懂三个数字,判断就完成一半:上限多少、这次申请多少、卡在哪个文件哪一行。
典型原文
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /www/wwwroot/site/wp-includes/class-wpdb.php on line 2345。134217728 除以 1024 两次正好是 128MB,说明上限是 128M;tried to allocate 那串是本次申请量,通常很小,说明是累积到顶而非单次过大。
三个常见的上限值
41943040 是 40M,单站点默认软上限;67108864 是 64M,多站点默认;268435456 是 256M,多数主机商给的默认值。看到 40M 基本可确定没被抬过,装几个插件就会顶到。
- 40M:单站默认,实际不够用
- 128M:能跑,做导入或构建器编辑时吃紧
- 256M:企业站与商城建议的起点
报错指向的文件是关键
卡在 wp-includes/class-wpdb.php,说明是一条查询返回了巨大结果集,比如一次性取几万条 postmeta;卡在 wp-includes/media.php,多半是上传了超大原图在生成缩略图;卡在某个插件的文件里,那就是那个插件的问题,不是全局配置不够。
500 不等于内存超限
500 是服务器层面的兜底状态码,可能是 PHP 致命错误、.htaccess 语法错误、FPM 进程崩溃或磁盘满。Web 服务器与 PHP 的错误日志两层都要看。
内存被打满的六个原因
调大只是止血,不是治病
把 memory_limit 从 128M 调到 512M,问题往往「消失」一阵,然后在数据量涨一倍时回来。判断该调还是该改代码,先看属于哪一类。
配置本身就不够
主机默认 40M 或 128M,而站点装了页面构建器、多语言、商城三套重插件。这类是纯粹的上限问题,调大即可。判断依据:报错稳定出现在同一类操作上,平时访问正常。
WP_MEMORY_LIMIT 被 PHP 卡住
在 wp-config.php 写 define('WP_MEMORY_LIMIT', '256M') 只对 WordPress 生效,且无法超过 PHP 的 memory_limit。PHP 是 128M 时写 256M 也没用,会取较小值。这是「改了没反应」最常见的原因。
- 前台用 WP_MEMORY_LIMIT
- 后台与导入用 WP_MAX_MEMORY_LIMIT
大图与缩略图
上传一张 6000 像素宽的原图,PHP 要把整图解码进内存再生成各个尺寸,一张就能吃掉上百 MB,批量上传更容易连爆。调内存治标,限制尺寸才治本。
查询返回过多数据
某个插件一次性 get_posts 取全部产品,或查 postmeta 没加 limit,几万行结果全进内存。表现是某个特定页面必崩、其他正常,报错落在数据库相关文件。
无限递归或死循环
钩子里调用了会再次触发同一钩子的函数,比如在 save_post 里又调用 wp_update_post。内存会一路涨到上限,同时 CPU 也会被打满。这类问题是代码缺陷,调内存只会让崩溃来得晚一点,必须改代码。
服务器整体内存不足
单看 PHP 上限没问题,但机器只有 1G 内存,MySQL 加上 PHP-FPM 的多个进程把物理内存吃光,系统 OOM killer 直接杀进程。表现是 500 间歇性出现,日志里能看到 Out of memory: Killed process 这类记录。
三层确认当前上限
后台、命令行、配置文件
WordPress 后台显示的数值、PHP 实际生效的数值、配置文件里写的数值,三者经常不一致。以实际生效的为准。
后台站点健康
「工具 → 站点健康 → 信息 → 服务器」,能看到 PHP 版本、内存上限、上传限制、执行时间。这是最快的一眼确认,但显示的是当前请求的值,某些面板会在不同路径下给不同值。
命令行查生效值
php -i | grep memory_limit 看 CLI 的值,注意 CLI 常与 FPM 不同。准确的做法是写一个临时 PHP 文件输出 ini_get('memory_limit'),通过浏览器访问,看完立刻删掉。
找配置的生效位置
php --ini 能看到加载了哪些 ini 文件。.user.ini、面板的 PHP 设置、php.ini、以及 FPM 池配置里的 php_admin_value,优先级从高到低。多层都写了值时,以优先级最高的为准,这也是「改了没生效」的常见原因。
定位 500 的顺序要反一下:先看 Web 服务器日志。/var/log/nginx/error.log 里出现 PHP Fatal error,真实原因在 PHP 那边;只有 upstream timed out,说明是处理太慢而非内存。
四个地方要同时改
只改一处多半无效
WordPress 的常量只是「申请」,真正给不给由 PHP 决定。下面四处按优先级排列,改完必须重启 PHP-FPM 或重载服务才生效。
wp-config.php 两个常量
在 /* That's all, stop editing! */ 之前加两行:define('WP_MEMORY_LIMIT', '256M'); 与 define('WP_MAX_MEMORY_LIMIT', '512M');。前者管前台,后者管后台与图片处理、导入导出这类重操作。改之前先备份这个文件,它有语法错误会直接白屏。
php.ini 提上限
找到 memory_limit = 128M 这一行改成 256M 或 512M。改完 systemctl reload php8.1-fpm。注意机器物理内存:8 个 FPM 进程各 512M,理论峰值 4G,1G 内存的机器直接就会 OOM,这种情况要先降进程数。
.user.ini 或面板设置
共享主机改不了 php.ini,就在根目录建 .user.ini 写 memory_limit = 256M,由 FPM 定期读取,生效有延迟。用面板的,直接在「PHP 设置」里改,面板会同时处理两层。
调 FPM 进程数
pm.max_children 决定同时能处理几个请求。这个值乘以单进程内存峰值就是理论占用。4G 内存的机器,单进程按 80M 估,pm.max_children 设 30 左右比较稳。设太大,流量高峰时会把机器打爆,表现是整站 502 而不是 500。
风险提示:改 php.ini 与 FPM 配置属于服务级操作,会影响同机所有站点。改前把原文件复制一份带日期后缀,改完先做语法检查,再 reload 而不是 restart——restart 会中断正在处理的请求。
不同站型的内存参考值
按实际负载定,不要一律拉满
表里的值是常用起点,不是标准答案。插件数量、产品数量、是否用页面构建器都会影响峰值。
| 站点类型 | memory_limit | WP_MAX_MEMORY_LIMIT | 说明 |
|---|---|---|---|
| 纯展示型企业站 | 128M | 256M | 十来个插件、无商城,够用 |
| 带页面构建器的站 | 256M | 512M | 编辑器前端渲染比前台更吃内存 |
| WooCommerce 商城 | 256M | 512M | 结账与订单导出时峰值明显抬高 |
| 多语言多站点 | 256M | 512M | 每个子站都会加载一套语言包 |
| 产品过万的目录站 | 512M | 768M | 批量导入与筛选查询吃内存 |
| 1G 内存的小机器 | 128M | 256M | 优先降 FPM 进程数,不是抬上限 |
如果报错只出现在后台的某个操作上,前台一直正常,多半是 WP_MAX_MEMORY_LIMIT 没设,它只影响后台,比调高全局更安全。若报错出现在前台并伴随明显变慢,先按WordPress 速度优化查查询与缓存。
调完之后怎么不再复发
四条日常动作
内存问题有很强的数据增长特征:上线时 128M 够用,两年后同样配置就不够。日常做四件事,能把复发推远。
限制上传尺寸
把原图长边限制在 2560 像素,上传前客户端压缩。300KB 与 8MB 的图,生成缩略图时的内存占用差几十倍。产品图统一走这个流程后,媒体库相关的报错会明显减少。
监控报错日志
打开 WP_DEBUG_LOG,错误写进 wp-content/debug.log。每周扫一次,重点看 Fatal error。这个文件会长大,记得限制大小或定期归档。
装插件前先算账
页面构建器、多语言、商城、备份这四类插件都是内存大户,同时装三个以上就要按 512M 规划。与其事后调参数,不如在选型时就把主机配置定到匹配的档位。
还有一种情况容易被误判:报 500 但日志里没有任何 Fatal error。这时查 .htaccess 语法、PHP 版本是否刚被切换、磁盘是否已满。排除顺序见WordPress 白屏排查。
内存与 500 常见五问
上限本身不占资源,PHP 按需分配,设 512M 不等于每次都吃 512M。真正的风险是并发:20 个请求同时处理大图、每个吃 200M,机器就被压垮。调上限时要同步核对 FPM 进程数。
三种可能:常量写在了 wp-settings.php 加载之后,位置太晚;PHP 的 memory_limit 更低,只能取小值;或缓存插件把配置缓存住了。先确认位置,再看 PHP 实际值。
有用但有限。上传峰值由原图像素量决定,一张超大图能吃掉几百 MB,调到 512M 也只是抬高门槛。更彻底的做法是限制原图尺寸、关闭不必要的缩略图生成。
按日志顺序找:Web 服务器错误日志 → PHP 错误日志 → debug.log。三层都没有,就临时打开 WP_DEBUG 并把 WP_DEBUG_DISPLAY 设为 false,让错误写进文件。生产环境别长期开着显示模式。
多数不是内存,而是兼容性。新版本移除了一些旧函数与语法,老插件会直接致命错误。日志里报错指向插件文件且与内存无关,就是兼容问题,处理路径见WordPress 插件冲突排查。回退版本只是把问题推迟。
站点反复 500 或内存告警
先看日志,再决定调参还是改代码
提供主机面板与一段时间的错误日志,我们判断是配置不足、插件缺陷还是查询设计问题,给出对应方案。若瓶颈在数据库层,可参考WordPress 数据库报错处理。
电话/微信 13280692153 邮箱 web@wordpressx.com 地址 山东省淄博市张店区电子产业创新园 B 座