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 设置。此方法对您的主机账户全局生效,无需创建任何额外文件。

  1. 使用主机用户名和密码登录 DirectAdmin。
  2. 进入账户管理器,点击 PHP 配置或 PHP 选择器。
  3. 选择您账户当前激活的 PHP 版本(例如 PHP 8.3)。
  4. 找到 upload_max_filesize,将其改为 64M 或 128M。
  5. 找到 post_max_size,将其设置为大于 upload_max_filesize 的值(例如 128M 或 256M)。
  6. 保存更改,稍等片刻待 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 按照一定顺序从多个来源读取配置值,后面的来源会覆盖前面的:

  1. 服务器级别的 php.ini(由主机服务商设置)
  2. 按目录的 php.ini 或 .user.ini(您在 public_html 中的文件)
  3. .htaccess 中的 php_value(仅限 mod_php)
  4. 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。

AsiaGB DirectAdmin 主机

AsiaGB 主机提供完整的 DirectAdmin 支持、PHP 8.3、MySQL 以及宽松的 PHP 限制,起价 500 泰铢/年。

查看主机计划

查看泰国虚拟主机全部套餐 →