在使用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 接口)時,能夠準確掌握請求細節,將極大提升問題排查效率。