cURL 是 PHP 中最強大、最常用的 HTTP 客戶端庫。本文以最簡潔的示例展示「初始化 → 設置選項 → 執行 → 關閉」的標準四步流程,並解釋每步作用,幫助新手快速上手。
<?php
// 1. 初始化 cURL 會話,傳入目標 URL
$ch = curl_init('https://www.w3mentor.com/robots.txt');
// 2. 設置選項:CURLOPT_RETURNTRANSFER => true 使 curl_exec 返回字符串而非直接輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 3. 執行請求
$page = curl_exec($ch);
// 4. 關閉會話,釋放資源
curl_close($ch);
echo $page; // 輸出 robots.txt 內容
?>
| 常量 | 作用 | 典型值 |
|---|---|---|
CURLOPT_URL | 目標 URL(也可在 curl_init() 中傳入) | 字符串 |
CURLOPT_RETURNTRANSFER | 返回響應體字符串,而非直接輸出 | true(必設) |
CURLOPT_HEADER | 是否在返回中包含響應頭 | false(默認) |
CURLOPT_FOLLOWLOCATION | 自動跟隨 3xx 重定向 | true |
CURLOPT_TIMEOUT | 最大執行秒數(連接+傳輸) | 10 |
CURLOPT_CONNECTTIMEOUT | 連接階段超時秒數 | 5 |
CURLOPT_SSL_VERIFYPEER | 驗證 SSL 證書(生產環境建議 true) | false(開發臨時關閉) |
CURLOPT_USERAGENT | 自定義 User-Agent | 'MyBot/1.0' |
CURLOPT_POST | 發送 POST 請求 | true |
CURLOPT_POSTFIELDS | POST 數據(陣列自動編碼為 multipart/form-data) | 陣列或字符串 |
CURLOPT_HTTPHEADER | 自定義請求頭數組 | ['Authorization: Bearer xxx'] |
CURLOPT_COOKIEJAR | 保存響應 Cookie 到文件 | /tmp/cookies.txt |
CURLOPT_COOKIEFILE | 發送請求時攜帶的 Cookie 文件 | /tmp/cookies.txt |
<?php
$ch = curl_init('https://api.example.com/users');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => '張三',
'email' => 'zhangsan@example.com',
]),
CURLOPT_TIMEOUT => 10,
]);
$resp = curl_exec($ch);
if ($resp === false) {
echo "錯誤:" . curl_error($ch);
} else {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "HTTP $httpCode\n$resp";
}
curl_close($ch);
?>
<?php
function curlSafeExec($ch) {
$resp = curl_exec($ch);
if ($resp === false) {
$errno = curl_errno($ch);
$error = curl_error($ch);
error_log("cURL[$errno] $error");
return null;
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode < 200 || $httpCode >= 300) {
error_log("HTTP $httpCode: $resp");
}
return $resp;
}
?>
curl_error($ch),常見原因:DNS 解析失敗、連接超時、SSL 證書驗證失敗、目標服務器拒絕連接。CURLOPT_SSL_VERIFYPEER => false;生產環境務必配置 CA 證書路徑 CURLOPT_CAINFO => '/etc/ssl/certs/ca-certificates.crt'。CURLOPT_HEADER => true,則 curl_exec 返回「頭部\r\n\r\n體」,需自行分割;或使用 curl_setopt($ch, CURLOPT_HEADERFUNCTION, $callback) 回調逐行處理。curl_multi_init() 多執行緒並發,或改用 Swoole / ReactPHP / Guzzle 異步客戶端。cURL 的核心流程只有四步:init → setopt(_array) → exec → close。掌握常用選項組合,即可應對 95% 的 HTTP 交互場景。建議將常用配置封裝為工具類或使用成熟庫(Guzzle、Symfony HttpClient),提升代碼可維護性與安全性。