往媒体库拖一张 8MB 的图,进度条走到一半弹出「上传的文件超过 php.ini 中 upload_max_filesize 的限制」,或者干脆一句「无法写入文件到磁盘」。这两类报错的根子完全不同,一个是 PHP 限额,一个是目录权限。先分清楚是哪种,再动手。
先确认当前限额到底是多少
后台「工具 → 站点健康 → 信息 → 服务器」里能直接看到 upload_max_filesize、post_max_size、memory_limit 三个值。命令行更快:
php -i | grep -E "upload_max_filesize|post_max_size|max_execution_time|memory_limit"
有个坑:CLI 用的 php.ini 和 PHP-FPM 用的经常不是同一个文件,改错了白忙。以站点健康页面显示的为准,找路径用:
php --ini
改 php.ini:最彻底的办法
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
max_execution_time = 300
这三个值有依赖关系:post_max_size 必须大于 upload_max_filesize,memory_limit 又要大于 post_max_size。否则大文件传到一半进程就被干掉了。改完重启 PHP-FPM:
systemctl restart php8.2-fpm
版本号按实际填,不确定就 systemctl list-units | grep php 看一眼。
没有主配置权限时的替代做法
共享主机改不了 php.ini。Apache 环境用根目录的 .htaccess:
php_value upload_max_filesize 64M
php_value post_max_size 128M
Nginx 下 .htaccess 不生效,改用站点根目录的 .user.ini:
upload_max_filesize = 64M
post_max_size = 128M
.user.ini 有缓存,默认 300 秒后才生效。改完立刻刷新说没变化的,多半是没等够。宝塔面板在「网站 → 设置 → 配置文件」和「软件商店 → PHP → 配置修改」里都有对应入口。
Nginx 那层还卡着一道 client_max_body_size
PHP 放开了,Nginx 没放开,浏览器会收到 413 Request Entity Too Large。在 server 段加一行:
client_max_body_size 128M;
nginx -t && systemctl reload nginx
报「无法写入文件到磁盘」是另一回事
这句话跟文件大小无关,多半是 uploads 目录权限或者磁盘满了。先看空间和 inode:
df -h
df -i
inode 耗尽的站点不少见,尤其是缓存插件生成了海量小文件。空间没问题就修权限,属主换成 Web 用户(Debian、Ubuntu 一般是 www-data,CentOS 常见 nginx 或 apache):
chown -R www-data:www-data /var/www/html/wp-content/uploads
find /var/www/html/wp-content/uploads -type d -exec chmod 755 {} \;
find /var/www/html/wp-content/uploads -type f -exec chmod 644 {} \;
还有一种比较隐蔽的:wp-config.php 里被写过 define(‘UPLOADS’, …) 指向了不存在的路径,搜一下确认。CentOS 开着 SELinux 的话,额外还要 chcon -R -t httpd_sys_rw_content_t 给 uploads 目录。
常见问题
问:改完为什么后台显示的最大上传值没变?
八成是改错了 php.ini,或者 PHP-FPM 没重启。用站点健康页面确认真实生效值,别只信命令行输出。
问:传大视频总是超时?
把 max_execution_time 和 Nginx 的 fastcgi_read_timeout 一起调到 300 秒。超过 100MB 的文件,建议直接 FTP 传进 uploads 目录,再用 Media from FTP 这类插件挂进媒体库。
问:把限额设成 0 是不是就不限制了?
恰好相反,upload_max_filesize 设 0 等于禁止上传。给一个够用的具体值就行。
照上面几步走完还是传不上去的话,把报错原文贴到 fenij.com 的评论区,我帮你看看卡在哪一层。