首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP cURL 獲取 HTTP 狀態碼與詳細響應資訊完整教學

     編輯:PHP 相關知識

核心:curl_getinfo()

`curl_exec()` 僅返回響應體(或 `true/false`)。**狀態碼、Header、傳輸時間、連線資訊**皆需執行後透過 `curl_getinfo()` 取得。

基本範例:取得 HTTP Status Code

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => 'https://example.com',
    CURLOPT_TIMEOUT        => 10,
    CURLOPT_HEADER         => false,   // 不將 Header 混入 body
    CURLOPT_NOBODY         => false,   // true 為 HEAD 請求
    CURLOPT_RETURNTRANSFER => true,    // 返回字串而非直接輸出
    CURLOPT_FOLLOWLOCATION => true,    // 自動追蹤 3xx 重定向
    CURLOPT_SSL_VERIFYPEER => true,    // 生產環境必開驗證
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 200, 301, 404, 500...

if ($httpCode >= 200 && $httpCode < 300) {
    echo "成功: $httpCode";
} elseif ($httpCode >= 300 && $httpCode < 400) {
    echo "重定向: $httpCode, 最終 URL: " . curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
} else {
    echo "錯誤: $httpCode";
}
curl_close($ch);

常用 CURLINFO_ 常數速查表

常數說明型別
CURLINFO_HTTP_CODE最後收到的 HTTP 狀態碼int
CURLINFO_EFFECTIVE_URL最終生效 URL(經過重定向)string
CURLINFO_TOTAL_TIME總耗時(秒,浮點)float
CURLINFO_CONNECT_TIME建立連線耗時float
CURLINFO_NAMELOOKUP_TIMEDNS 解析耗時float
CURLINFO_PRETRANSFER_TIME從開始到準備傳輸float
CURLINFO_STARTTRANSFER_TIME第一個位元組到達時間(TTFB)float
CURLINFO_REDIRECT_TIME重定向總耗時float
CURLINFO_REDIRECT_COUNT重定向次數int
CURLINFO_SIZE_UPLOAD上傳位元組數float
CURLINFO_SIZE_DOWNLOAD下載位元組數float
CURLINFO_SPEED_DOWNLOAD平均下載速度(bytes/sec)float
CURLINFO_HEADER_SIZEHeader 大小(位元組)int
CURLINFO_REQUEST_SIZE請求大小int
CURLINFO_CONTENT_TYPEContent-Type(需 CURLOPT_HEADER=true)string
CURLINFO_PRIMARY_IP連線的伺服器 IPstring
CURLINFO_CERTINFOSSL 憑證詳細資訊(陣列)array

一次取得所有資訊

$info = curl_getinfo($ch); // 不帶第二參數,返回關聯陣列
print_r($info);
/* 範例輸出:
Array
(
    [url] => https://example.com
    [content_type] => text/html; charset=UTF-8
    [http_code] => 200
    [header_size] => 312
    [request_size] => 78
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.123456
    [namelookup_time] => 0.0123
    [connect_time] => 0.0456
    [pretransfer_time] => 0.0789
    [starttransfer_time] => 0.1012
    [redirect_time] => 0
    [redirect_url] =>
    [primary_ip] => 93.184.216.34
    [certinfo] => Array()
    [primary_port] => 443
    [local_ip] => 192.168.1.5
    [local_port] => 54321
)
*/

進階:同時獲取 Header 與 Body(不依賴 CURLOPT_HEADER)

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true, // Header 包含在返回字串中
]);
$response = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $headerSize);
$body   = substr($response, $headerSize);

// 解析 Header 為陣列
$headers = [];
foreach (explode("\r\n", $header) as $line) {
    if (strpos($line, ':') !== false) {
        [$k, $v] = explode(':', $line, 2);
        $headers[trim($k)] = trim($v);
    }
}

錯誤處理最佳實踐

if (curl_errno($ch)) {
    $errMsg = curl_error($ch);
    $errNo  = curl_errno($ch);
    // 記錄錯誤,拋出異常或返回失敗標記
    throw new \RuntimeException("cURL error ($errNo): $errMsg");
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode >= 400) {
    // 視業務決定是否拋出異常
}
curl_close($ch);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved