# 增加 WordPress 内存限制

Source: https://support.kapsulehost.com/zh-cn/wordpress-memory-limit

当 WordPress 或某个插件因内存耗尽而崩溃时，解决办法是提高 PHP 内存限制，而在 KapsuleHost 上，这是 KPanel 中的一个下拉选项，而不是需要编辑文件。本指南将说明这个错误的含义、如何修改限制值、应该选择哪个数值，以及当增加内存仍无法解决问题时该怎么办。

## 错误信息的样子

最明显的形式是页面上打印出来或写入错误日志的一条致命错误：

```
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 20480 bytes)
```

将字节数除以 1,048,576 即可换算为 MB：`268435456` 是 256 MB，`134217728` 是 128 MB。

它并不总是如此明确地表现出来。同样的底层问题还可能表现为：

- 完全空白的白屏，没有任何提示信息，通常只出现在某一个特定页面上。
- WordPress 仪表盘能正常加载，但某个具体的后台页面（插件、产品、网站健康）却崩溃。
- 媒体上传或导入进行到一半就停止。
- 仅在负载较高时才出现的 500 错误。

> **Note:** 在做出任何更改之前，请先确认问题确实出在内存上。打开网站的 **设置**，然后点击 **PHP** 选项卡，滚动到 **PHP错误日志**，点击 **加载日志**。这会显示最近 200 条记录，并带有级别筛选器。内存耗尽错误会以 **Fatal** 的形式出现。如果日志为空，说明问题出在别处：可以参考[WordPress 白屏问题](https://support.kapsulehost.com/zh-cn/wordpress-white-screen)和[读懂您的错误日志](https://support.kapsulehost.com/zh-cn/error-logs)。

## 在 KPanel 中修改限制值

1. 登录 [KPanel](https://kpanel.kapsulehost.com)，点击左侧边栏中的 **网站**。
2. 点击您要修改的网站。
3. 在该网站自己的菜单中，打开 **设置**，然后进入 **PHP**。
4. 找到 **PHP 设置** 卡片以及 **内存限制** 一行。
5. 从下拉菜单中选择一个数值：`128M`、`256M`、`512M`、`1024M` 或 `2048M`。
6. 点击 **保存设置**。

![KPanel 中某网站的 PHP 设置界面，可在此选择内存限制](https://support.kapsulehost.com/help/screenshots/wordpress-memory-limit.b15db306.webp)

无需重启，网站在整个过程中都会保持在线。您的设置会被写入网站根目录下的一个 `.user.ini` 文件中，该文件由 KPanel 为您管理。

> **Tip:** 新的数值并不总是在下一次页面加载时立即生效。服务器会对 `.user.ini` 进行最长五分钟的缓存，因此如果显示的仍是旧的限制值，请等待几分钟后再检查，不要急于认定更改没有生效。

同一个卡片中还控制着另外四个经常需要和内存一起调整的数值：

| 设置项 | 可选范围 | 需要提高的情形 |
|---|---|---|
| 内存限制 | 128M 至 2048M | 出现内存致命错误、后台页面空白 |
| 最大执行时间 | 30 至 600 秒 | 导入、导出及报表生成进行到一半就停止 |
| 最大上传大小 | 16M 至 256M | 主题压缩包或视频文件因过大而被拒绝 |
| 最大输入变量 | 1000 至 10000 | 菜单项很多、表单很大、产品含大量变体 |

此处未显示 Post max size，因为 KapsuleHost 会自动设置该值，始终比您的上传限制高出 1 MB，这样即使表单携带的文件达到上限，也仍然能够提交。

## 应该选择哪个数值

每个 KapsuleHost 网站的初始值都是 **256M**，这已经是 WordPress 默认值的两倍，对绝大多数网站来说都已足够。只有在实际出现错误时才需要调高。

| 网站类型 | 建议的限制值 |
|---|---|
| 使用轻量主题的宣传页面或博客 | 256M 已经足够 |
| 使用页面构建器主题且插件数量在 20 个以上的网站 | 先用 256M，若仍出错再调到 512M |
| 商品目录规模适中的 WooCommerce 商店 | 256M |
| 带订阅功能、变体众多，或使用重度库存插件的 WooCommerce | 512M |
| 多站点网络或大型会员网站 | 512M 至 1024M |

> **Warning:** 请不要直接跳到 2048M。极高的限制值并不会让网站变快：它只会让一个失控的插件在失败之前消耗服务器更多的资源，从而把本来只影响单个页面的故障，变成拖慢所有访客访问速度的问题。每次只调高一档，重新测试，一旦错误消失就停止调整。

## 在 wp-config.php 中设置限制值

KPanel 的下拉菜单设置的是服务器层面的上限。WordPress 自身也有两个常量，用来在该上限范围内申请内存，有些文档会建议您设置它们：

```php
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
```

`WP_MEMORY_LIMIT` 适用于前台。`WP_MAX_MEMORY_LIMIT` 适用于后台管理区域，后台通常需要更多内存。请使用内置编辑器（**设置**，然后 **文件管理器**）或通过 SFTP，将这两行添加到 `wp-config.php` 文件中 `/* That's all, stop editing! */` 这一行的上方。

> **Warning:** WordPress 的常量永远不能超过服务器的限制值。如果 KPanel 下拉菜单中显示的是 `256M`，却将 `WP_MEMORY_LIMIT` 设置为 `1024M`，那么实际得到的仍然只是 256M，您只会误以为问题已经解决。请始终先提高 KPanel 中的数值。

对大多数人来说，这两个常量是不必要的。只需设置好 KPanel 中的数值，不必去动 `wp-config.php`。

## WooCommerce 注意事项

商店类网站是超过 256M 的最常见原因。可以在 wp-admin 中的 **WooCommerce**，然后 **Status** 页面查看商店自身看到的限制值：系统状态报告会打印出它所看到的 PHP 内存限制，这是确认您在 KPanel 中所做更改确实生效的好方法。

如果您符合以下任何一种情况，请将限制值提高到 512M：

- 可变商品且每个商品都有数十种变体。
- 使用 WooCommerce Subscriptions 或预订类扩展插件。
- 同时启用两个或更多支付网关插件。
- 后台运行库存或账务同步任务。

WooCommerce 后台页面缓慢或超时，通常是内存和执行时间共同作用的结果。请同时将 **最大执行时间** 提高到 120 秒，并可参考[设置 WooCommerce](https://support.kapsulehost.com/zh-cn/wordpress-woocommerce)中的缓存选项。

## 也请检查您的 PHP 版本

如果内存错误是在更改 PHP 之后立即出现的，那么版本本身也可能是原因之一：较旧的插件在较新的运行环境中可能会严重泄漏内存。同一选项卡顶部的 **PHP 版本** 卡片会显示该网站当前运行的版本，并允许您在 PHP 8.4、8.3、8.2 和 8.1 之间切换。

更改版本会重启该网站的 PHP 进程池，因此会有几秒钟的停机时间。详细说明请参阅[更改您的 PHP 版本](https://support.kapsulehost.com/zh-cn/changing-php-version)。

## 当增加内存仍无法解决问题时

如果提高了两次限制值仍不见改善，说明有某些东西正在不正常地消耗内存。请按以下顺序排查：

1. **先做备份。**每次都应先完成[创建备份](https://support.kapsulehost.com/zh-cn/taking-a-backup)。
2. **找出问题插件。**不要一次停用一个插件，而应分两半停用：先关闭一半，重新测试，再在仍然出错的那一半中继续细分。您也可以使用 **WordPress** 选项卡下的 **Plugins** 中的 **Plugin safe mode**，它会一次性关闭所有插件，但不会删除任何插件数据。
3. **测试主题。**暂时切换到 WordPress 默认主题。如果某个主题在每次页面加载时都运行大量重度查询，就会产生这种现象。
4. **关注具体操作，而不是整个网站。**如果只有导入操作失败，问题通常出在执行时间和批处理大小上，而不是内存。请尝试分批进行更小规模的导入。
5. **查看日志。**PHP 选项卡中的 **PHP错误日志** 会指出耗尽内存时所运行的文件和行号，通常能立即定位到问题插件。

如果在调高到 512M 并完成插件排查测试后问题依然存在，请发送邮件至 [support@kapsulehost.com](mailto:support@kapsulehost.com)，并附上网站域名、确切的致命错误信息行，以及问题发生时您正在进行的操作。
