做站这些年,最常见的报错之一就是后台顶个黄条,写着“缓存写入失败”或者“无法写入缓存文件”。新手一看就慌,以为服务器要挂了,其实这毛病九成以上跟权限、磁盘空间、插件配置这三样有关,跟网站数据本身关系不大,真正需要重装系统或者换主机的少之又少。报错可能来自 WordPress 自身、缓存插件或者 PHP 进程,动手前先分清层次。这篇按我实际的排查顺序讲一遍:先看磁盘和 inode,再查目录属主和权限,接着核对 WP_CACHE 常量和残留的 drop-in 文件,最后去 debug.log 里抓那条被拒绝的路径。

第一步:先看磁盘和 inode 满没满
顺序上我坚持先看磁盘,因为它在同类故障里占比不低,验证起来也最快。SSH 连上服务器,敲一句 df -h,看每一行的 Use% 那一列,只要根分区或者挂载 wp-content 的那个分区超过九成就得警觉。更隐蔽的是 inode,磁盘明明还有剩余空间,但小文件数量被用光了,照样写不进去,这时候再敲 df -i 看 IUse% 那一列。两个命令都正常,才继续往下查。要是真满了,先找占地方的大家伙,缓存目录、日志文件、备份压缩包是最常见的三类,清完再复现一次看报错还在不在。
第二步:查 wp-content/cache 的属主
很多人第一反应是 chmod -R 777 一把梭,这是最容易埋雷的做法。正确的思路是先看属主对不对,再谈权限。用 ls -l 看一眼 wp-content 下面的 cache 目录,属主应该是跑 PHP 的那个用户,虚拟主机上常叫 www 或者 www-data,面板环境里多半是 www。要是属主变成了 root,那是历史上用 root 手动解压或者执行过命令留下的,PHP 进程自然写不进去。修正的办法是 chown -R www:www wp-content/cache,把整个目录连同子目录和文件的属主一次改过来。改完再敲一遍 ls -l 确认,别改完不看结果。
权限给多少合适:目录 755 文件 644
属主对了之后再看权限位。我的习惯是目录给 755,文件给 644,这是绝大多数环境都能跑通的组合。命令分两次敲更稳:先 find wp-content/cache -type d -exec chmod 755 {} + 处理所有目录,再 find wp-content/cache -type f -exec chmod 644 {} + 处理所有文件。一步到位的递归写法看着省事,但容易把某些本来需要执行权限的脚本也压成 644,后面又冒出新问题。另外提醒一句,如果服务器开了 SELinux,光改属主和权限位还不够,还得看安全上下文对不对,这部分不同系统差别很大,建议以服务商和系统官方文档的说明为准。
第三步:核对 wp-config.php 里的 WP_CACHE
权限都正常还报错,就该翻配置文件了。打开站点根目录的 wp-config.php,找那一行 define 开头的 WP_CACHE 常量。它的作用是告诉 WordPress 要不要加载 advanced-cache.php 这个提前加载文件。常见坑有两个:一是缓存插件已经停用甚至删掉了,但这行常量还留着,WordPress 每次启动都去找 advanced-cache.php,文件早就不在了,于是报写入或者加载失败;二是反过来,常量没开,插件后台却以为缓存正常开着,两边的状态对不上,前台表现就是缓存时有时无。处理很简单,插件不用了就把这行常量注释掉或者删除,重启一次 PHP 服务再观察。
第四步:清理残留的 object-cache.php
对象缓存这块特别容易被忘掉。去 wp-content 目录下看一眼有没有 object-cache.php,顺带看看 advanced-cache.php,这两个文件都属于 drop-in,意思是插件往这一放,WordPress 就会自动加载,哪怕插件已经在后台停用了也照样生效。很多站点换过缓存方案,磁盘缓存、对象缓存、内存缓存来回装过几轮,留下的旧 drop-in 指向已经不存在的类或者目录,一加载就崩。判断标准是:后台插件列表里已经没有对应的缓存插件,而 wp-content 里还躺着这两个文件,那就先备份到本地再删掉,观察一天没异常就可以彻底清掉。
第五步:去 debug.log 里抓被拒的路径
上面几步都是按经验排查,其实最快的一招是直接问日志。先在 wp-config.php 里把调试开关打开,把 WP_DEBUG 和 WP_DEBUG_LOG 都设为 true,注意这个开关别长期开着,生产站点上日志很容易越滚越大。然后复现一次报错,去 wp-content/debug.log 里看最新的几条记录,里面会写清哪个函数在哪条路径上失败了,是被拒还是目录不存在,一眼就能看出是哪个插件、哪个目录在闹脾气。我的经验是十次里有七八次,日志给出的路径跟我一开始猜测的完全不是一回事,先看日志能省下大量试错时间。
第六步:把缓存方式从磁盘改成 Redis
如果磁盘、权限、常量、drop-in 全查完都正常,报错却反复出现,那就该换个思路,别在磁盘上死磕了。文件缓存天生受权限和磁盘状态影响,站点一上量,频繁读写还会把 inode 和磁盘读写压力拉高。换成内存型缓存就绕开了文件系统这一层。前提是服务器上已经装好 Redis 服务并且能正常连接,再在插件后台把缓存方式从磁盘切到 Redis 或者内存对象缓存,填上地址和端口,地址一般是 127.0.0.1,端口默认 6379,保存之后清一次旧缓存再验证。
后台具体在哪个位置改
说清界面位置,省得你到处翻。W3 Total Cache 里,进入性能菜单下的页面缓存和对象缓存两个模块,把缓存方法分别从磁盘改成 Redis,再回常规设置里保存并清空全部缓存。WP Super Cache 的思路略有不同,它管的主要是页面缓存,缓存内容以文件形式落盘,所以更常见的做法是让它继续管页面缓存,另外装一个对象缓存插件走 Redis,两边分工,别让两个插件抢同一个 drop-in 文件。改完一定回前台刷新几次页面,确认没有新的报错,再回日志里看有没有新写入的告警。
几个容易踩的坑和判断标准
最后补充几个我自己踩过的坑。头一个,用 root 身份手动上传或者解压过文件,属主全变成 root,PHP 写不进去,这是最高发的原因;第二个,只修好了 wp-content/cache 一个目录,另一个插件的缓存目录被漏掉,报错依旧;第三个,装了安全插件或者主机自带防护,把 PHP 写 wp-content 的行为当成可疑操作拦下来,这种要去主机面板翻拦截记录;第四个,多个缓存插件同时启用,互相打架。判断标准很简单:每次只改一个变量,改完立刻复现一次,能复现就回退,别一次改五样,最后谁也说不清是哪一步真正生效。
缓存写入失败这事儿,说穿了就是磁盘、权限、配置这三条线,按顺序走一遍基本都能落地。我的固定顺序是:先用 df -h 和 df -i 确认空间,再 ls -l 看属主并用 chown 修正,接着按目录 755、文件 644 摆平权限,然后核对 WP_CACHE 常量和两个 drop-in 文件,还搞不定就去 debug.log 里抓被拒的路径,最后实在不行把缓存从磁盘换成 Redis,绕开文件系统这一层。养成改完就看日志的习惯,下次再碰到类似报错,你也能几分钟定位。做站久了会发现,大部分吓人的报错,背后都是特别朴素的小问题。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!