PHP 入门教程
PHP 调试技巧
本教程共 65 篇 · 第 44 篇 · 更新于 2026-07-24 · 约 5 分钟阅读
PHPPHP8调试Xdebugvar_dump日志断点调试
44. PHP 调试技巧
本节目标:掌握从简单到高级的 PHP 调试手段,学会用
var_dump、Xdebug、日志等手段快速定位问题。
调试是程序员的日常。从一行简单的输出到专业的断点调试,本章覆盖各种场景下的调试方法。
44.1 基础输出调试
var_dump() 和 print_r()
<?php
$user = [
"id" => 1,
"name" => "张三",
"tags" => ["php", "web"],
];
print_r($user);
/*
Array
(
[id] => 1
[name] => 张三
[tags] => Array
(
[0] => php
[1] => web
)
)
*/
var_dump($user);
// 包含类型信息:string(6) "张三"、array(2) {...}
Tip
var_dump()显示类型和长度,调试时信息更完整。print_r()输出更简洁,适合快速查看结构。
美化输出(配合 HTML)
<?php
function dd(mixed $data): void {
echo "<pre style='background:#f4f4f4;padding:10px;border:1px solid #ccc;'>";
var_dump($data);
echo "</pre>";
exit;
}
// 使用
$users = fetchUsers();
dd($users); // 输出并终止,防止后续代码干扰
NoteLaravel 等框架内置了
dd()(Dump and Die)函数,非常实用。原生 PHP 可以手动实现一个。
44.2 日志调试
输出调试在 CLI 环境方便,但 Web 环境下刷新页面就会消失。日志可以持久保存:
<?php
function logDebug(string $message, mixed $data = null): void {
$line = sprintf(
"[%s] %s\n",
date("Y-m-d H:i:s"),
$message
);
if ($data !== null) {
$line .= print_r($data, true) . "\n";
}
error_log($line, 3, "debug.log");
}
// 使用
logDebug("用户数据", $_POST);
logDebug("SQL 查询", $sql);
按级别记录
<?php
enum LogLevel: string {
case DEBUG = "DEBUG";
case INFO = "INFO";
case WARN = "WARN";
case ERROR = "ERROR";
}
function logMessage(LogLevel $level, string $message): void {
$line = sprintf("[%s] [%s] %s\n", date("Y-m-d H:i:s"), $level->value, $message);
file_put_contents("app.log", $line, FILE_APPEND | LOCK_EX);
}
logMessage(LogLevel::ERROR, "数据库连接失败");
TipPHP 8.1 的枚举(Enum)让日志级别类型更安全,避免传入无效字符串。
44.3 错误日志配置
确保服务器记录了所有错误:
; php.ini 开发环境
display_errors = On
log_errors = On
error_log = /var/log/php_errors.log
; php.ini 生产环境(不显示给用户,只记录)
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
查看最近错误:
tail -f /var/log/php_errors.log
44.4 Xdebug:专业断点调试
Xdebug 是 PHP 最强大的调试工具,支持断点、单步执行、查看变量等。
安装 Xdebug
pecl install xdebug
在 php.ini 中配置:
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
IDE 配合
VS Code 安装 PHP Debug 扩展,配置 launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
}
]
}
然后在代码左侧点击设置断点,F5 启动调试,程序会在断点处暂停,你可以:
- 查看所有变量的值
- 单步执行(Step Over / Step Into)
- 查看调用栈
- 修改变量值继续执行
NoteXdebug 会显著降低执行速度,仅在开发和调试时使用,生产环境务必关闭。
44.5 浏览器调试工具
查看响应头
<?php
// 在脚本开头加这个,查看所有响应头
headers_sent() || var_dump(headers_list());
网络面板调试 AJAX
前端调用 PHP 接口时,用浏览器 F12 网络面板:
- 查看请求 URL、Method、Headers 是否正确
- 查看请求体(Payload)是否携带了参数
- 查看响应状态码和返回数据
- 查看响应时间,判断是否是后端性能问题
44.6 常见调试场景
页面空白(White Screen of Death)
<?php
// 临时开启错误显示
ini_set("display_errors", "1");
error_reporting(E_ALL);
// 或者查看错误日志
echo file_get_contents(ini_get("error_log"));
变量 unexpectedly null
<?php
// 检查变量是否存在、类型是否正确
var_dump(isset($var));
var_dump($var ?? "默认值");
var_dump(gettype($var));
接口返回不符合预期
<?php
// 记录请求信息和响应过程
logDebug("收到请求", $_SERVER["REQUEST_METHOD"] . " " . $_SERVER["REQUEST_URI"]);
logDebug("请求参数", $_POST);
logDebug("数据库返回", $dbResult);
44.7 调试 checklist
- 先看错误日志,定位大致范围
- 用
var_dump()检查输入数据是否符合预期 - 用
var_dump()检查中间结果是否正确 - 检查数据类型,特别是
null、false、0的区别 - 复杂逻辑用 Xdebug 断点逐步跟踪
- 生产环境用日志代替屏幕输出
来源:参考了 GitHub「php-the-right-way」XDebug 章节、PHP 官方文档及相关调试指南,改写后所得。