當前位置: 首頁> 最新文章列表> 使用curl_close 結束cURL 會話後,如何查看調試信息?

使用curl_close 結束cURL 會話後,如何查看調試信息?

gitbox 2025-05-26

在使用PHP 的cURL 擴展進行HTTP 請求時, curl_close()是一個常用的函數,用於在請求完成後釋放資源。但是開發者在調試請求或排查問題時,往往還想獲取請求過程中的詳細信息,比如DNS 解析時間、連接耗時、響應頭等。那麼問題來了:

一、curl_getinfo 必須在curl_close 前調用

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);

二、更詳細的日誌:使用CURLOPT_VERBOSE 輸出調試信息

如果你想查看更低層次的調試信息,例如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 實現HTTP 日誌封裝

在實際項目中,如果你希望統一處理請求日誌、錯誤信息等,可以對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']);

通過封裝,開發者可以輕鬆控制請求和日誌的管理流程,避免在每個請求中重複配置。

四、小結

  1. curl_getinfo()一定要在curl_close()之前調用;

  2. 要查看詳細調試信息,啟用CURLOPT_VERBOSE ,並結合CURLOPT_STDERR將日誌輸出到文件;

  3. 通過封裝可以更好地控制日誌輸出和調試流程。

掌握這些調試技巧,對於開發和維護基於cURL 的PHP 網絡請求功能來說,是非常必要的。特別是在對接第三方API(如GitBox 接口)時,能夠準確掌握請求細節,將極大提升問題排查效率。