首页 / PHP 入门教程 / PHP 调试技巧

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); // 输出并终止,防止后续代码干扰
Note

Laravel 等框架内置了 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, "数据库连接失败");
Tip

PHP 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)
  • 查看调用栈
  • 修改变量值继续执行
Note

Xdebug 会显著降低执行速度,仅在开发和调试时使用,生产环境务必关闭。

44.5 浏览器调试工具

查看响应头

<?php
// 在脚本开头加这个,查看所有响应头
headers_sent() || var_dump(headers_list());

网络面板调试 AJAX

前端调用 PHP 接口时,用浏览器 F12 网络面板:

  1. 查看请求 URL、Method、Headers 是否正确
  2. 查看请求体(Payload)是否携带了参数
  3. 查看响应状态码和返回数据
  4. 查看响应时间,判断是否是后端性能问题

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

  1. 先看错误日志,定位大致范围
  2. var_dump() 检查输入数据是否符合预期
  3. var_dump() 检查中间结果是否正确
  4. 检查数据类型,特别是 nullfalse0 的区别
  5. 复杂逻辑用 Xdebug 断点逐步跟踪
  6. 生产环境用日志代替屏幕输出

来源:参考了 GitHub「php-the-right-way」XDebug 章节、PHP 官方文档及相关调试指南,改写后所得。