雖然 file_get_contents()、file()、readfile() 可簡單抓取網頁,但它們無法處理:POST 請求、檔案上傳、Cookie 管理、HTTP 認證、代理伺服器、超時控制、錯誤處理、自訂 Header 等進階需求。cURL 是解決這些問題的標準工具。
$ch = curl_init(); // 1. 初始化
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com'); // 2. 設定選項
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch); // 3. 執行並取得回應
curl_close($ch); // 4. 關閉釋放
$response = curl_exec($ch);
if ($response === false) { // 必須用 ===,因為空字串也是合法回應
throw new Exception('cURL 錯誤: ' . curl_error($ch), curl_errno($ch));
}
// 取得詳細傳輸資訊
$info = curl_getinfo($ch);
echo "HTTP 狀態碼: {$info['http_code']}\n";
echo "總耗時: {$info['total_time']} 秒\n";
echo "下載大小: {$info['size_download']} bytes\n";
$post_data = [
'username' => 'alice',
'password' => 'secret',
'action' => 'login',
];
$ch = curl_init('https://example.com/login');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $post_data, // 自動編碼為 application/x-www-form-urlencoded
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_COOKIEJAR => 'cookies.txt', // 儲存 Cookie
CURLOPT_COOKIEFILE => 'cookies.txt', // 讀取 Cookie
]);
$response = curl_exec($ch);
$post_data = [
'file' => new CURLFile('/path/to/photo.jpg', 'image/jpeg', 'photo.jpg'), // PHP 5.5+
// 舊版寫法:'file' => '@/path/to/photo.jpg;type=image/jpeg;filename=photo.jpg'
'description' => '個人大頭照',
];
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$url = 'https://example.com/large.zip';
$local_path = '/data/downloads/large.zip';
$fp = fopen($local_path, 'wb');
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_FILE => $fp, // 直接寫入檔案指標
CURLOPT_FOLLOWLOCATION => true,
]);
curl_exec($ch);
curl_close($ch);
fclose($fp);
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_PROXY, '222.73.173.50:8080');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'proxy_user:proxy_pass'); // 若需認證
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); // 或 SOCKS5
$payload = json_encode([
'order_id' => '20240101001',
'amount' => 1234.56,
'items' => [['sku' => 'A001', 'qty' => 2]],
]);
$ch = curl_init('https://api.payment.com/orders');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Content-Length: ' . strlen($payload),
'Authorization: Bearer ' . $access_token,
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
| 選項 | 說明 |
|---|---|
| CURLOPT_TIMEOUT | 最大執行秒數 |
| CURLOPT_CONNECTTIMEOUT | 連線階段逾時秒數 |
| CURLOPT_FOLLOWLOCATION | 自動跟隨 3xx 重導向 |
| CURLOPT_MAXREDIRS | 最大重導向次數 |
| CURLOPT_SSL_VERIFYPEER | 驗證 SSL 憑證(生產環境請保持 true) |
| CURLOPT_SSL_VERIFYHOST | 驗證 SSL 域名(2=嚴格) |
| CURLOPT_USERAGENT | 自訂 User-Agent |
| CURLOPT_REFERER | 設定 Referer 標頭 |
| CURLOPT_HTTPHEADER | 自訂 Header 陣列 |
| CURLOPT_COOKIEJAR / FILE | Cookie 持久化儲存/讀取檔案 |
CURLOPT_RETURNTRANSFER 以程式化處理回應curl_setopt_array() 批次設定選項,程式碼更清晰CURLOPT_SSL_VERIFYPEERhttpClient)