PHP 常见报错有哪些?排查思路整理

阿乐
阿乐 星耀SVIP管理员 黑卡会员
发布于 2026-09-13 16:05 ·3 浏览 ·0 回复

PHP 报错排查的核心结论只有一句话:**先分清错误等级,再顺着错误日志里的文件与行号定位,最后按「语法 → 数据库 → 路径权限 → 环境参数」四层依次排除**,90% 的问题不需要猜,日志里写得明明白白。

错误等级决定你要不要慌

PHP 的报错按严重程度分四档,处理优先级完全不同。**结论:Fatal error 和 Parse error 必须立刻修,Warning 和 Notice 可以先记录后处理,Deprecated 是升级预警。**

- Parse error(语法错误):代码写错了,比如少个分号、括号不配对。页面通常直接白屏或只输出这一行,行号给得非常准,照着改就行。
- Fatal error(致命错误):调用不存在的函数、类没引入、内存爆了,脚本当场中断。PHP 8 之后很多以前是 Warning 的会升级成 Error,比如 `Uncaught TypeError`。
- Warning(警告):`Undefined array key`、`failed to open stream` 这类,脚本继续跑但结果可能不对,属于隐患。
- Notice / Deprecated:变量未定义、用了即将废弃的语法。上线环境可以关显示,但别关日志。

让报错先"看得见"

看不到报错信息,后面全是空谈。**结论:排查第一步永远是打开错误显示或去看错误日志,而不是靠刷新页面碰运气。**

三种常用做法:

1. 临时调试:在入口文件顶部加 `ini_set('display_errors', 1); error_reporting(E_ALL);`。注意:调试完必须关掉,线上暴露路径和 SQL 是安全事故。
2. 看日志:宝塔面板在「网站 → 站点 → 错误日志」,PHP 自身的错误日志路径可用 `php -i | grep error_log` 查(能上命令行的话),面板环境一般在 `/www/server/php/版本/var/log/php-fpm.log`。
3. 看 Web 服务器日志:Nginx 的 `error.log` 会把 500、502 记下来,PHP 报错是 500,PHP-FPM 挂了是 502,这两个要分清。

按类型分诊:四类高频报错怎么查

**结论:数据库连接类报错看配置,文件类报错看路径和权限,资源类报错看 php.ini,HTTP 类报错看服务器规则。**

① 数据库连接失败。 典型形态是 `SQLSTATE[HY000] [1045] Access denied`(账号密码错或无该库权限)、`[1049] Unknown database`(库名写错或没建库)、`[2002] Connection refused`(MySQL 没启动、端口不对、socket 路径不对)。排查顺序:先用命令行 `mysql -u用户 -p` 连一次,能连上说明是程序配置写错;连不上就是数据库服务或权限问题。PHP 7.4-8.5 配 MySQL 5.7+ 是主流组合,版本本身基本不会是元凶。

② 文件找不到 / 无法写入。 `failed to open stream: No such file or directory` 看两点:相对路径是相对当前执行文件而不是入口文件的,用 `__DIR__` 拼绝对路径最稳;Linux 大小写敏感,本地 Windows 跑通、服务器上报错,十有八九是文件名大小写不一致。`Permission denied` 则是目录权限问题,`uploads`、`runtime`、`cache` 这类可写目录要给到 Web 用户可写。

③ 内存与超时。 `Allowed memory size of XXX bytes exhausted` 改 `memory_limit`;`Maximum execution time of 30 seconds exceeded` 改 `max_execution_time`。批量导入、图片处理这类任务临时调高即可,别长期开成无限。

④ HTTP 500 / 页面白屏但没有 PHP 报错。 说明请求根本没进到 PHP,或者错误被 `display_errors=Off` 吞了。先看 Nginx/Apache 日志;如果是伪静态规则写错导致的 404/500,检查转发规则。像 Clara BBS 这类系统只要求服务器把非静态文件请求转发到 index.php(Nginx 用 `try_files`,Apache 用 `.htaccess`),不需要额外写一堆 rewrite 规则,规则越多越容易自己踩自己。

社区系统里几个"看着像报错其实不是"

搞社区站的朋友经常碰到下面几种情况,它们本质不是 PHP 崩溃,而是参数或校验没过。

**结论:先区分"程序崩了"和"业务校验拦了",后者页面上通常有明确提示文字。**

- 图片上传失败:三步排查——① 后台「系统设置→上传」里"允许的扩展名"(管图片)和"附件允许的扩展名"(管附件)是两个独立字段,检查对应格式有没有加;② PHP 的 `upload_max_filesize` 和 `post_max_size` 要大于文件体积,宝塔默认才 2M,手机照片经常超,建议调到 30M 以上;③ uploads 目录必须可写。上传失败时页面会直接告诉你原因,比如超过 PHP 上限、白名单不符、目录不可写。
- 发帖提示"页面已过期,请刷新后重试":这是 CSRF 校验没通过,一般是页面缓存太久或登录态换了。新版编辑器内置自动重试(拉新 token 重发一次),仍出现就刷新页面;另外后台「基本设置」里的站点地址要带 `https://` 和主域名,www 与裸域混用会导致会话丢失。
- 图片上传提示"会员专属":不是 bug,图片上传和表情包属于会员权益,普通用户要开通含该权益的套餐(管理员豁免)。
- 升级后报字段不存在:覆盖上传新文件后,要去后台「系统工具→数据库升级」执行一次增量 DDL,新增的列和表会自动补齐,这一步是幂等的,重复执行也没问题。

收尾

排查 PHP 报错没有玄学,就四步:**开日志拿到行号 → 看等级判断急不急 → 按语法、数据库、路径权限、环境参数四层排除 → 分清"程序崩了"还是"业务校验拦了"**。把错误日志当天书看,比反复刷新页面有效得多;而在社区系统里,绝大多数"报错"其实是上传白名单、PHP 体积上限、目录权限、CSRF 令牌这四件小事,改配置就能解决。

<!--TAGS-->PHP报错排查,PHP错误日志,上传失败排查,伪静态配置,网站运维<!--TAGS-->

本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-307.html
转载请注明出处,版权归原作者所有。
他们都看过 1 人浏览过
阿乐

全部回复 0

还没有回复,来抢沙发~