做 PHP 开发,大半时间都耗在调试报错上。
空白白屏、500 服务器错误、语法报错、未定义变量,很多新手一头雾水,不知道从哪下手排查。
其实大部分常见报错都有固定排查逻辑和通用解决思路,今天把步骤和典型问题整理出来,以后遇到直接套用就行。
本文用大白话讲解,不带废话,实操性强,看懂就能直接用到项目里,建议收藏备用。
一、先开启 PHP 错误提示,定位问题根源
很多项目线上关闭了错误显示,本地开发也没打开,结果一报错只看到白屏或模糊提示,根本不知道错在哪里。
第一步永远是让错误“现原形”。
在入口文件或配置文件最顶部加上:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
如果这样还不显示错误,检查 php.ini 里 display_errors = On,并确认 error_reporting 级别不是 0。
开发阶段强烈建议把错误直接输出到页面,别只写日志,肉眼看到报错行号是最快的。
二、语法类报错:少分号、括号不匹配
语法错误通常页面直接报 Parse error: syntax error, unexpected ...,PHP 会告诉你在第几行。
常见类型:
排查办法:
- 直接跳到 PHP 指示的那一行往上、往下各看 3 行,90% 问题就在这里。
- 如果标的是脚本最后一行,把范围扩大到文件末尾,检查括号是否闭合。
- 用编辑器的高亮和括号匹配功能快速定位,比肉眼高效得多。
例子:
echo"hello // 报错:漏了右引号和分号
改:
echo"hello";
三、变量未定义、数组下标不存在解决办法
这类“注意”级别(Notice)和“警告”(Warning)最容易被忽略,却经常导致逻辑错误甚至白屏。
1. 变量未定义
报错类似:Notice: Undefined variable: name
解决:使用前先判存,或给默认值。
// 安全获取 GET 参数
$name = isset($_GET['name']) ? $_GET['name'] : '';
在 PHP 7+ 可用 ?? 简写:
$name = $_GET['name'] ?? '';
2. 数组下标不存在
报错 Undefined index 或 Undefined array key,就说明拿了一个数组里没有的键。
解决:先用 isset() 或 array_key_exists() 判断。
$arr = ['a' => 1];
if (isset($arr['b'])) {
echo $arr['b'];
}
// 或者直接给默认
$val = $arr['b'] ?? '默认值';
养成习惯,对来自外部($_GET, $_POST, API返回值)的数据,都先判存再使用,能消灭一半以上的 Notice。
四、白屏空白页、500 错误通用排查流程
这是最让人头大的情况——页面直接空白,或者显示 500 Internal Server Error,没有任何错误内容。
标准排查顺序:
强制显示错误(即使框架有错误处理)
在脚本最开头设置 ini_set('display_errors', 1); error_reporting(E_ALL);
如果是框架(如 Laravel、ThinkPHP),也要把调试模式打开。
检查 PHP 错误日志
如果页面上还是看不到,直接去看 php_errors.log 或 error_log 文件。
不确定位置?执行 phpinfo(); 搜索 error_log。
排查致命错误(Memory exhausted、超时、类找不到等)
日志里常见:
Fatal error: Allowed memory size → 内存不够,增大 memory_limit 或优化代码Class 'XXX' not found → 文件没引入或命名空间错误,检查 autoloadMaximum execution time exceeded → 超时,可能是死循环或慢查询
检查文件 BOM 头和输出缓冲
如果文件加了 BOM,或者脚本开头意外输出空格、空行,可能导致“header already sent”类的错误,继而白屏或重定向失败。用编辑器(如 VS Code 右下角编码点一下选 “UTF-8 without BOM”)保存。
分段调试
在代码头部 die('到这里没问题');,然后逐步往下移,找到真正让脚本终止的位置。
.htaccess 或 Nginx 配置
500 错误也可能是服务器配置导致,比如重写规则写错、权限不对,确认最近是否改动过配置文件。
错误排查流程
- 错误没显示 → 先开
display_errors。 - 没有任何报错但结果不对 → 用
var_dump()、debug_backtrace() 打调用栈。
总之,PHP 报错并不可怕,只要养成 先打开显示 → 读报错行 → 判存判空 → 看日志 的固定流程,调试时间至少能砍掉一半。下次再遇到报错,直接套用这篇文章一步步走,绝对比盲目搜索高效得多。
以上就是本次分享的 PHP 新手避坑技巧,内容都是工作实战总结,觉得有用可以点赞、收藏,方便后续随时回看。
专注分享 PHP、ThinkPHP、MySQL 实战开发干货,只讲工作能用得上的技巧,不堆砌理论、不写废话。
建议收藏本号,后续持续更新避坑教程、实战源码和面试知识点,有问题欢迎评论区留言交流。