關鍵選項
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 1 = 回傳字串,0 = 直接輸出
完整流程
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 僅測試用,生產請驗證憑證
$response = curl_exec($ch);
if ($response === false) {
$errno = curl_errno($ch);
$error = curl_error($ch);
echo "cURL 錯誤 ($errno): $error";
} else {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
echo "HTTP $httpCode\n";
echo "Type: $contentType\n";
var_dump($response); // 這裡拿到完整回應字串
}
curl_close($ch);
常見誤區
- 忘記設定
CURLOPT_RETURNTRANSFER,導致 curl_exec() 直接輸出且回傳 true,無法拿到內容。
- 多執行緒
curl_multi_* 時,需對每個 handle 設定此選項,並用 curl_multi_getcontent($ch) 取得內容。
- 大回應記憶體不足 → 改用
CURLOPT_WRITEFUNCTION 串流寫入檔案。
進階:同時取得 Header 與 Body
curl_setopt($ch, CURLOPT_HEADER, 1); // 回傳包含 Header
$response = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);