WordPress 用户在共享主机上遇到的最令人沮丧的错误之一,就是无法上传文件——无论是图片、主题包、插件还是媒体资源。错误信息各异:"The uploaded file exceeds the upload_max_filesize directive in php.ini"、"HTTP error",或仅仅是无提示的失败,媒体库中没有任何文件出现。几乎所有情况下,根本原因都是 PHP 上传限制默认值过低。本指南涵盖在 DirectAdmin 主机上增大上传限制的所有方法,详细说明每种方法的原理(或失效原因),并提供可直接使用的配置代码片段。
了解控制文件上传的 5 个 PHP 设置
在尝试任何修复之前,需要了解 PHP 通过多个相互关联的配置指令(而非仅一个)来限制文件上传。所有指令都必须正确设置才能使上传成功。即使只有一个指令的值低于所需值,无论其他指令如何配置,上传都会失败。
| PHP 指令 | 默认值 | 控制内容 | 推荐值 |
|---|---|---|---|
upload_max_filesize |
2M | 单个文件最大大小 | 64M 或 128M |
post_max_size |
8M | 整个 POST 请求的最大大小 | 128M(必须大于 upload_max_filesize) |
memory_limit |
128M | 每个 PHP 脚本的最大内存 | 256M |
max_execution_time |
30 | 脚本最大运行时间(秒) | 120–300 |
max_input_time |
60 | 接收输入的最大时间(秒) | 120–300 |
需要记住的关键规则是:post_max_size 必须始终大于 upload_max_filesize。POST 请求携带文件数据和表单元数据,因此若 post_max_size 等于或小于 upload_max_filesize,PHP 将在处理文件内容之前截断请求。这是导致上传无提示失败或产生不明错误的常见配置错误。
方法一 — 使用 DirectAdmin PHP 配置面板
最简便可靠的方法是直接在 DirectAdmin 控制面板中修改 PHP 设置。此方法对您的主机账户全局生效,无需创建任何额外文件。
- 使用主机用户名和密码登录 DirectAdmin。
- 进入账户管理器,点击 PHP 配置或 PHP 选择器。
- 选择您账户当前激活的 PHP 版本(例如 PHP 8.3)。
- 找到 upload_max_filesize,将其改为
64M或128M。 - 找到 post_max_size,将其设置为大于 upload_max_filesize 的值(例如
128M或256M)。 - 保存更改,稍等片刻待 PHP 重新加载。
保存后,在 WordPress 后台的媒体 > 添加新文件中验证更改。显示的最大上传文件大小应反映新限制。您也可以创建临时 phpinfo 文件来确认新值已生效。
方法二 — 在 public_html 中创建 php.ini 文件
若您的主机服务商允许按目录设置 php.ini 文件(许多 DirectAdmin 主机支持),此方法可提供持久的覆盖,不受服务器级别 PHP 配置更新影响。在 public_html 根目录中创建名为 php.ini 的文件,内容如下:
upload_max_filesize = 128M post_max_size = 256M memory_limit = 256M max_execution_time = 300 max_input_time = 300
要验证文件是否被读取,可在同一目录中创建临时测试文件 check.php:
<?php
echo 'upload_max_filesize: '.ini_get('upload_max_filesize').'<br>';
echo 'post_max_size: '.ini_get('post_max_size').'<br>';
echo 'memory_limit: '.ini_get('memory_limit').'<br>';
?>
在浏览器中打开 https://yourdomain.com/check.php。若值仍显示旧的默认值,说明服务器不支持按目录 php.ini 文件——请继续尝试方法三。测试完成后务必删除 check.php,因为公开访问 PHP 信息文件存在安全风险。
方法三 — 使用 .user.ini 文件(PHP-FPM 环境)
现代主机环境(包括大多数 DirectAdmin 配置)使用 PHP-FPM(FastCGI 进程管理器)而非 Apache mod_php。在 PHP-FPM 模式下,.htaccess 中的 php_value 指令无效。正确的替代方案是 .user.ini 文件,其语法与 php.ini 完全相同,专为 FastCGI 环境中的按用户目录覆盖而设计。
在 public_html 目录中创建名为 .user.ini(注意前导点号)的文件:
upload_max_filesize = 128M post_max_size = 256M memory_limit = 256M max_execution_time = 300 max_input_time = 300
重要提示:PHP-FPM 会缓存 .user.ini 文件的内容,默认缓存有效期为 300 秒(5 分钟)。因此,创建或编辑文件后,可能需要等待最多 5 分钟新设置才能生效。您也可以联系主机服务商,请求清除 PHP-FPM 配置缓存以加快生效速度。
专家建议:如果不确定服务器使用 mod_php 还是 PHP-FPM,可在 public_html 目录中同时创建内容相同的 php.ini 和 .user.ini。PHP 会根据运行方式自动使用适当的文件。同时存在两个文件不会产生冲突,并可确保最大兼容性。
方法四 — 在 .htaccess 中使用 php_value 指令
此方法仅在 PHP 以 Apache mod_php 方式运行时有效。打开 WordPress 根目录中的 .htaccess 文件(通常为 public_html/.htaccess),添加以下内容:
php_value upload_max_filesize 128M php_value post_max_size 256M php_value memory_limit 256M php_value max_execution_time 300 php_value max_input_time 300
重要警告:若服务器不支持 .htaccess 中的 php_value,Apache 将对网站的每个页面返回 500 内部服务器错误。若发生这种情况,请立即删除这些行。建议先测试单个指令,再添加全部五个,以降低停机风险。
现有的 WordPress .htaccess 通常包含固定链接处理的 RewriteRules。请将 php_value 行添加在文件顶部,即以 # BEGIN WordPress 开头的 WordPress 生成块之前,以避免与重写规则冲突。
方法五 — 通过 wp-config.php 配置 WordPress
WordPress 有自己的内存限制常量,可在 wp-config.php 中设置。这些常量告诉 WordPress 请求多少 PHP 内存,但无法覆盖服务器设置的硬性 PHP 限制——只能请求不超过该限制的值。打开 wp-config.php,在 require_once ABSPATH . 'wp-settings.php'; 行之前添加:
/** WordPress 内存限制 */ define( 'WP_MEMORY_LIMIT', '256M' ); define( 'WP_MAX_MEMORY_LIMIT', '512M' );
WP_MEMORY_LIMIT 适用于前端页面渲染,而 WP_MAX_MEMORY_LIMIT 适用于 WordPress 后台,后台需要更多内存来处理媒体和插件管理等任务。建议同时设置两个值以全面覆盖。
此外,如需在 WordPress 内以编程方式调整上传大小限制,可在主题的 functions.php 中使用过滤器钩子:
add_filter( 'upload_size_limit', function( $size ) {
return 128 * 1024 * 1024; // 128 MB(以字节为单位)
});
请注意,此过滤器只能降低上传限制,无法超过 PHP 允许的值。当您需要为特定用户角色或 WordPress 上下文限制上传时,此方法非常有用。
验证更改
应用上述任何方法后,在宣布问题解决之前,请始终验证新设置已生效。
通过 WordPress 后台验证
在 WordPress 后台进入媒体 > 添加新文件。上传区域下方,WordPress 会显示最大上传文件大小。若值仍显示旧限制(如 2 MB 或 8 MB),说明更改尚未生效。
通过 PHP 脚本验证
在 public_html 中创建临时 check.php 文件,内容如下,然后通过浏览器访问:
<?php
$values = [
'upload_max_filesize' => ini_get('upload_max_filesize'),
'post_max_size' => ini_get('post_max_size'),
'memory_limit' => ini_get('memory_limit'),
'max_execution_time' => ini_get('max_execution_time'),
];
foreach ($values as $key => $val) {
echo "<strong>$key</strong>: $val<br>";
}
?>
测试完毕后请立即删除此文件。PHP 信息文件会暴露服务器配置详情,可能被攻击者利用。
了解配置优先级
PHP 按照一定顺序从多个来源读取配置值,后面的来源会覆盖前面的:
- 服务器级别的
php.ini(由主机服务商设置) - 按目录的
php.ini或.user.ini(您在 public_html 中的文件) .htaccess中的php_value(仅限 mod_php)- PHP 代码中的
ini_set()调用(仅适用于可更改的指令)
若服务器管理员对某指令设置了硬性上限,您的按目录文件无法超过该上限——只能降低它。若需要超过当前文件能设置的限制,请联系主机服务商。
故障排除——配置更改后上传仍然失败
在某些情况下,即使正确更新了 PHP 限制,上传仍可能失败。以下是其他需要排查的因素。
Nginx client_max_body_size
若您的主机在 Apache 和 PHP 前使用 Nginx 作为反向代理,则存在一个名为 client_max_body_size 的 Nginx 指令,它在请求到达 PHP 之前就限制了传入请求的大小。若该值低于您期望的上传大小,上传将在 Nginx 层被拒绝,并可能出现"413 Request Entity Too Large"错误。此指令只能由服务器管理员更改,请联系主机支持团队请求增大该值。
大文件上传期间 WordPress Nonce 过期
WordPress 使用在设定时间后过期的 nonce(安全令牌)。通过慢速连接上传非常大的文件时,上传时间可能超过 nonce 有效期,导致 WordPress 以安全错误拒绝请求。将 max_execution_time 和 max_input_time 增加到 300 秒或更长,可降低此问题发生的概率。
磁盘配额已满
在 DirectAdmin 的系统信息与文件中检查磁盘使用情况。若您的主机账户已达到磁盘配额,即使 PHP 限制正确,WordPress 也无法保存新上传的文件。请释放空间或升级主机套餐来解决此问题。
wp-content/uploads 目录权限
WordPress 上传目录需要写权限。正确权限为目录 755、文件 644。权限不正确将导致 WordPress 无法将上传文件保存到磁盘。可通过 DirectAdmin 的文件管理器或 FTP 修复:
# 通过 SSH 修复权限(如有 Shell 访问权限)
chmod 755 wp-content/uploads
find wp-content/uploads -type f -exec chmod 644 {} \;
find wp-content/uploads -type d -exec chmod 755 {} \;
WordPress 推荐 PHP 设置
对于配置良好的 WordPress 主机环境,以下 PHP 设置提供了坚实的基准。使用 WooCommerce、Elementor 或 Divi 等页面构建器,或插件较多的站点,可能需要将 memory_limit 设置得更高——某些情况下甚至达到 512M。
# WordPress 主机推荐基准配置 upload_max_filesize = 128M post_max_size = 256M memory_limit = 256M max_execution_time = 300 max_input_time = 300 max_input_vars = 5000
此处设为 5000 的 max_input_vars 指令常被忽视,但对于插件较多的 WordPress 站点非常重要。当插件设置页面提交的表单字段数量超过 max_input_vars 允许的数量(默认为 1000)时,PHP 会无提示地截断数据,导致设置保存错误或根本无法保存。将其设为 5000 可防止除插件极多的安装外的所有情况出现此问题。
常见问题
为什么即使文件很小,WordPress 也无法上传?
WordPress 同时强制执行多个 PHP 限制:upload_max_filesize、post_max_size、memory_limit 和 max_execution_time。只要其中任意一个限制低于您要上传的文件,上传就会失败。此外,post_max_size 必须始终大于 upload_max_filesize,因为 POST 请求包含文件数据和表单元数据。
在 DirectAdmin 中如何修改 PHP 设置?
在 DirectAdmin 中,进入账户管理器 > PHP 配置或额外功能 > PHP 设置,即可直接修改 upload_max_filesize 和 post_max_size。您也可以在 public_html 目录中创建 php.ini 文件来覆盖服务器级别的设置。某些主机环境还支持 .user.ini 文件。
upload_max_filesize 和 post_max_size 有什么区别?
upload_max_filesize 是每个单独上传文件的最大大小。post_max_size 是整个 HTTP POST 请求正文的最大大小,包括所有上传文件和其他表单数据。因此,post_max_size 必须始终大于 upload_max_filesize——例如,若上传为 64M,则 post 应至少设为 128M。
我修改了 .htaccess 但上传仍然失败,下一步该怎么办?
.htaccess 中的 php_value 指令只有在 PHP 以 Apache mod_php 模式运行时才有效。若您的主机使用 PHP-FPM 或 CGI 模式(现代服务器常见),.htaccess 中的 php_value 则无效。请改用 .user.ini 文件,将其放在 public_html 目录中,使用与 php.ini 相同的语法,例如:upload_max_filesize = 64M 和 post_max_size = 128M。