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,可以串联一个请求在所有服务中的日志。平时多花点时间在日志上,线上出问题的时候能省很多时间。