排查 PHP Allowed memory size exhausted,确认 CLI 与 PHP-FPM 配置差异,核算内存上限并定位插件、导入、图片和代码问题。
先不要把 PHP 内存直接改成无限:看到 Allowed memory size of ... bytes exhausted,说明某次 PHP 请求触及了当前 memory_limit。先在宝塔面板确认网站实际使用的 PHP 版本,再到“软件商店 → 已安装 → 对应 PHP 版本 → 设置”查看配置与错误日志;SSH 用户也可从 PHP-FPM 服务和站点日志取证。默认做法是先定位报错脚本与触发动作,临时小幅提高上限只用于恢复和复现,不能代替修插件、批处理或代码。
查看日志和配置通常不额外收费;升配云服务器、增加监控或把大任务迁到队列可能收费。修改 memory_limit 不会直接删除数据库,但过大的单进程上限会让多个 PHP-FPM 工作进程同时吃光物理内存,触发 OOM、502 或整机失去响应。改动前备份对应配置文件,记录原值,并避开订单、发布或导入高峰。
先确认是哪一个动作、哪一个 PHP 运行环境报错
先记下完整错误时间、文件路径、行号、尝试分配的字节数,以及用户当时在做什么。只有后台导入、图片处理或备份时报错,与每次打开首页都报错,是两条不同路径。前者可能是单次任务过大;后者更像插件循环、主题代码或缓存构建反复占用内存。
在网站相同运行环境中核对生效值。CLI 与 PHP-FPM 可能加载不同的 php.ini,所以只运行 php -i 不能证明网页请求使用了同一配置。下面命令都是读取操作;PHP-FPM 服务名和日志路径要按宝塔中显示的版本替换。
php --ini
php -r 'echo "memory_limit=" . ini_get("memory_limit") . PHP_EOL;'
systemctl list-units --type=service | grep -E 'php.*fpm'
sudo journalctl -u 你的PHP-FPM服务 --since "30 minutes ago" --no-pager
如果报错只存在于 Web 请求,优先以 PHP-FPM 池、宝塔配置页或站点错误日志为准。不要把包含服务器路径、数据库信息或访客参数的完整日志公开粘贴到论坛。也不要长期放置可公网访问的 phpinfo() 页面;它会暴露模块、路径和环境变量。
宝塔、php.ini 和 WordPress 的内存设置有什么区别
| 位置 | 控制范围 | 常见误区 |
|---|---|---|
| 宝塔中对应 PHP 版本的配置 | 通常影响该版本的 PHP-FPM | 改错 PHP 版本,重载后网站仍使用旧值 |
php.ini 或池级配置 | 控制 PHP 进程允许脚本分配的上限 | CLI 与 FPM 配置文件不是同一份 |
.user.ini | 在允许时覆盖指定目录及子目录 | 有缓存生效时间,且可能被更高层配置限制 |
WP_MEMORY_LIMIT | WordPress 尝试申请的 PHP 内存 | 不能保证突破主机或池级硬限制 |
WordPress 的常量应写在加载 wp-settings.php 之前。它适合表达 WordPress 的需要,但最终仍受 PHP 与主机策略约束。若宝塔已经把 FPM 上限固定得更低,仅改 wp-config.php 可能没有效果。
上限应该改到多少
不要从报错里的“尝试分配多少字节”直接推算新上限。那只是失败当刻还想申请的一块内存,不是整个请求的峰值。先在低风险时段复现一次,结合错误日志、应用监控或代码中的 memory_get_peak_usage() 观察峰值,再给正常波动留出余量。同时按“单个 PHP-FPM 进程可用上限 × 可能并发进程数”检查最坏情况是否超出服务器可分配内存。
临时恢复时可以选择一个高于当前峰值、但不会让全部工作进程耗尽主机内存的有限值。不要使用 -1 作为生产修复,也不要照抄别人的 512M、1G。小内存服务器、图片站和 WooCommerce 站的安全范围不同;提交前同时查看宝塔性能调整中的进程数量、系统可用内存和 Swap。
若确需修改配置,先复制原文件,再只改实际生效的配置项。下面的 256M 只是格式示例,不是推荐值;请换成依据实测峰值和并发预算得出的有限值。
memory_limit = 256M
保存后应使用宝塔的配置检查与重载入口,或对实际 PHP-FPM 服务先做语法检查再重载。重启 PHP-FPM 会中断正在处理的请求;有上传、结算或导入任务时应先停止新任务并等待在途请求结束。
只加内存为什么经常过几天又报错
内存上限只是保险丝。报错文件和触发动作更能说明根因:
- 某个插件或主题路径稳定出现:先在预发布副本升级、回退或停用对应组件,不要一次关闭全部插件后失去证据。
- 导入、备份、生成缩略图时出现:缩小每批记录或图片数量,使用断点和队列,让每个请求只处理有限工作。
- 首页每次访问都增长:检查递归调用、一次性加载全部结果、未分页查询和把大文件整体读入字符串的代码。
- 同时出现系统 OOM 或 PHP-FPM 进程被杀:转向主机内存和进程数量,不再继续提高单请求上限。
- 只在管理后台出现:比较普通页面与后台任务加载的插件、编辑器和数据量,必要时单独安排后台批任务。
WordPress 恢复模式可以帮助登录后台定位致命错误,但它不证明问题已经解决。站点已无法进入时,可参考WordPress 致命错误恢复模式;如果内核已经杀进程,再按Linux OOM 排查检查整机证据。
怎样验证修改真的生效
- 重载后从网站实际使用的 PHP-FPM 环境确认
memory_limit,不要只看 CLI。 - 用同一文件大小、记录数量和插件组合重做原动作,记录完成时间与峰值。
- 同时观察 PHP-FPM 日志、站点错误日志、系统可用内存和 OOM 记录。
- 连续测试普通页面、后台登录、计划任务和一次低风险写入,确认没有新 502 或请求中断。
- 在监控窗口结束后,把临时上限收敛到经过容量核算的值。
若提高上限后错误变成 502、整机内存快速下降或任务仍在相同位置耗尽,应立即停止复现,恢复配置备份并重载 PHP-FPM。保留报错时间和日志,转向修复插件、代码或批处理设计。PHP-FPM 本身无法启动时,可继续参考宝塔 PHP 502 排查,不要用反复重启掩盖配置错误。
官方资料
以上资料于 2026 年 9 月 4 日核验。PHP 版本、宝塔菜单和托管环境限制可能变化,最终以网站实际加载的配置、当前官方文档和日志为准。

