`curl_exec()` 僅返回響應體(或 `true/false`)。**狀態碼、Header、傳輸時間、連線資訊**皆需執行後透過 `curl_getinfo()` 取得。
$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_HTTP_CODE | 最後收到的 HTTP 狀態碼 | int |
| CURLINFO_EFFECTIVE_URL | 最終生效 URL(經過重定向) | string |
| CURLINFO_TOTAL_TIME | 總耗時(秒,浮點) | float |
| CURLINFO_CONNECT_TIME | 建立連線耗時 | float |
| CURLINFO_NAMELOOKUP_TIME | DNS 解析耗時 | 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_SIZE | Header 大小(位元組) | int |
| CURLINFO_REQUEST_SIZE | 請求大小 | int |
| CURLINFO_CONTENT_TYPE | Content-Type(需 CURLOPT_HEADER=true) | string |
| CURLINFO_PRIMARY_IP | 連線的伺服器 IP | string |
| CURLINFO_CERTINFO | SSL 憑證詳細資訊(陣列) | 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
)
*/
$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);