PHP错误日志与调试技巧大全
2026/6/7 13:55:00 网站建设 项目流程

PHP错误日志与调试技巧大全

调试是开发过程中必不可少的环节。PHP提供了丰富的调试工具和日志记录功能。今天说说各种调试技巧。

var_dump和print_r是最快的调试方式。

```php
function debugLog(mixed $var, string $label = ''): void
{
if ($label) echo "$label: ";
echo '

'; var_dump($var); echo '

';
}

$data = ['user' => ['name' => '张三', 'age' => 28], 'scores' => [95, 87, 92]];
debugLog($data, '用户数据');
?>
```

Xdebug是PHP最强大的调试工具。配置好IDE的调试端口后,可以设置断点、单步执行、查看变量。

```php
// php.ini配置
// xdebug.mode=debug
// xdebug.start_with_request=yes
// xdebug.client_host=127.0.0.1
// xdebug.client_port=9003
// xdebug.idekey=PHPSTORM

function factorial(int $n): int
{
if ($n <= 1) return 1;
return $n * factorial($n - 1);
}

echo factorial(10) . "\n";
?>
```

错误日志记录也很重要。error_log可以写文件,Monolog是专业的日志库。

```php
error_log("用户登录失败");

$context = ['user_id' => 123, 'ip' => '192.168.1.1'];
error_log(json_encode([
'time' => date('Y-m-d H:i:s'),
'level' => 'ERROR',
'message' => '数据库连接失败',
'context' => $context,
]));

// 自定义日志函数
function appLog(string $level, string $message, array $context = []): void
{
$entry = json_encode([
'time' => date('c'),
'level' => $level,
'message' => $message,
'context' => $context,
'pid' => getmypid(),
], JSON_UNESCAPED_UNICODE);

file_put_contents('/tmp/app.log', $entry . "\n", FILE_APPEND | LOCK_EX);

if ($level === 'ERROR' || $level === 'CRITICAL') {
error_log($entry);
}
}

appLog('INFO', '用户登录成功', ['user_id' => 123]);
appLog('ERROR', '支付失败', ['order_id' => 'ORD-001']);
?>
```

设置错误处理器可以统一处理错误。

```php
set_error_handler(function (int $level, string $message, string $file, int $line) {
if (!(error_reporting() & $level)) return false;
throw new ErrorException($message, 0, $level, $file, $line);
});

set_exception_handler(function (Throwable $e) {
http_response_code(500);
error_log("未捕获异常: {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}");

if ($_SERVER['APP_ENV'] === 'development') {
echo "错误: {$e->getMessage()}\n";
echo "追踪: {$e->getTraceAsString()}\n";
} else {
echo json_encode(['error' => '服务器内部错误']);
}
});

throw new RuntimeException('测试异常');
?>
```

线上环境关闭display_errors,开启log_errors。错误信息只记录日志不给用户看,既安全又方便排查问题。

生产环境排查问题的时候,日志是主要手段。结构化日志配上请求ID,可以串联一个请求在所有服务中的日志。平时多花点时间在日志上,线上出问题的时候能省很多时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询