|
|
Xiuno 常见报错排查与调试方法这件事,说难不难,说简单也绝不简单。难在环境各不相同、插件千奇百怪,简单在于套路大同小异:先稳住现场,复现问题,读清报错,再层层剥洋葱。下面按我自己踩坑总结一套可落地的排查路径。
第一步是还原运行环境。很多报错源自升级了 PHP、换了 Web 服务器或动了配置文件。确认 PHP 版本与扩展:Xiuno 经典版本更偏向 PHP 5.6–7.2 区间,升级到 7.4/8.x 后常见函数弃用、严格类型报错。用 phpinfo() 或命令行检查:mbstring、pdo_mysql、json、curl 是否启用;另外确认文件权限,runtime、upload 等目录需可写,权限不当会导致缓存写入失败、上传报错。
第二步打开“眼睛”。Xiuno 的报错有三类:PHP 致命/警告、数据库 SQL 报错、JS 前端异常。建议在测试环境开启 display_errors 和 error_reporting(E_ALL),线上则写入 error_log。Xiuno 自身会在 tmp/log 或 runtime 目录留日志(视版本/定制而定),配合服务器日志一起看,能迅速定位函数与行号。前端问题用浏览器控制台与网络面板抓包,看 4xx/5xx、跨域、CSRF、JSON 解析失败等。
第三步清缓存,但不要盲目。模板编译缓存、数据缓存有时会把旧代码残影带进来。先备份再清理 cache/tmp 目录,后台有“更新缓存”入口也可以用。如果清缓存后问题消失,多半是模板或配置变更未同步;若问题出现得更频繁,可能是缓存目录权限或序列化不兼容(PHP 版本切换后常见)的信号。
数据库相关报错有其规律。常见的 SQL 语法错误通常来自老旧插件未适配新版本 MySQL(如 ONLY_FULL_GROUP_BY 或严格模式)。解决思路:打印最终 SQL、在数据库里手动执行看报错码;对字段长度、字符集 utf8/utf8mb4 做一致性检查;自增主键与索引缺失会导致写入慢或重复键冲突。迁移主机后出现问号/乱码,多半是连接字符集没设好或库表混用 utf8 与 utf8mb4。
插件与主题是“灾难制造机”。新装或刚升级后突然报错,优先怀疑它。做法是最小化环境:临时禁用可疑插件,恢复默认主题,逐个启用验证;注意一些插件会改写核心函数或公共库,即使禁用残留文件也可能影响加载顺序。版本不匹配时,函数签名变化、钩子参数数量不一致都会直接报错,按版本说明核对依赖。
代码层面的典型坑包括:未定义变量/索引(PHP 7+ 更严格)、函数弃用(mysql_*、each() 等)、时区与时间函数造成的 warning、文件包含路径相对/绝对混乱。调试时加上断点式日志:在关键分支写入 var_export($var, true) 到日志,少用 echo 直接输出以免打断 header 发送。涉及上传与附件,优先检查 php.ini 的 upload_max_filesize、post_max_size、max_execution_time 以及 Nginx/Apache 的 limit 设置;超过阈值时后端可能收不到任何数据,看起来“像前端坏了”。
前端报错别忽略。模板中未转义的变量易引起 XSS 风险,也会在某些数据形态下打断脚本执行。异步接口返回非标准 JSON(BOM、PHP notice 混入)时,控制台会直接提示 JSON.parse 失败;用 curl 直接请求接口,确认响应头与内容是否干净。验证码、登录、发帖异常,多半与 CSRF/token 校验、Cookie 域名、HTTPS 混用导致的 SameSite 问题有关。
最后是“复位与对比”。把线上与本地对比:核心文件校验哈希是否被改动;用干净的同版本包覆盖核心,再逐步合并自定义改动;用版本控制(哪怕是临时 git init)来记录每一次变更,出问题时快速回滚。别忘了做数据库与上传目录的快照,任何结构性操作前先备份。
整体节奏就是:确认环境与权限—开启详尽日志—清理缓存并复现—最小化插件与主题—聚焦后端 SQL/错误栈—校正前端请求与响应—对比复位。坚持这条路径,80% 的 Xiuno 报错都能在可控时间内定位并解决。 |
|