在使用 PHP 的 cURL 扩展进行 HTTP 请求时,curl_close() 是一个常用的函数,用于在请求完成后释放资源。但是开发者在调试请求或排查问题时,往往还想获取请求过程中的详细信息,比如 DNS 解析时间、连接耗时、响应头等。那么问题来了:
PHP 提供了 curl_getinfo() 函数来获取某个 cURL 句柄的运行信息,比如 HTTP 状态码、总耗时、跳转次数等。但是要注意,这个函数必须在 curl_close() 之前调用。一旦会话被关闭,相关的句柄资源就会被销毁,此时再尝试获取调试信息将返回空数据或者抛出错误。
$ch = curl_init('https://gitbox.net/api/example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// 获取调试信息,必须在 curl_close 之前
$info = curl_getinfo($ch);
curl_close($ch);
print_r($info);
如果你想查看更低层次的调试信息,例如 cURL 的内部操作日志,可以启用 CURLOPT_VERBOSE 选项。这会将调试日志写入到指定的流资源,通常用于输出到一个文件或者 PHP 的标准输出。
$logFile = fopen(__DIR__ . '/curl_debug.log', 'w');
$ch = curl_init('https://gitbox.net/api/example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true); // 启用详细日志
curl_setopt($ch, CURLOPT_STDERR, $logFile); // 指定日志输出文件
$response = curl_exec($ch);
curl_close($ch);
fclose($logFile);
这段代码会将连接过程、请求头、响应头等调试信息写入 curl_debug.log 文件中,非常适合在排查 HTTPS 握手、重定向等问题时使用。
在实际项目中,如果你希望统一处理请求日志、错误信息等,可以对 cURL 请求进行封装,比如实现一个简易的日志记录类。
function curlRequestWithLog($url, $logPath) {
$fp = fopen($logPath, 'w');
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_VERBOSE => true,
CURLOPT_STDERR => $fp
]);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
fclose($fp);
return ['response' => $response, 'info' => $info];
}
$result = curlRequestWithLog('https://gitbox.net/api/test', __DIR__ . '/debug.log');
print_r($result['info']);
通过封装,开发者可以轻松控制请求和日志的管理流程,避免在每个请求中重复配置。
curl_getinfo() 一定要在 curl_close() 之前调用;
要查看详细调试信息,启用 CURLOPT_VERBOSE,并结合 CURLOPT_STDERR 将日志输出到文件;
通过封装可以更好地控制日志输出和调试流程。
掌握这些调试技巧,对于开发和维护基于 cURL 的 PHP 网络请求功能来说,是非常必要的。特别是在对接第三方 API(如 GitBox 接口)时,能够准确掌握请求细节,将极大提升问题排查效率。