cURL (Client URL Library) 是 PHP 最強大的 HTTP 客端庫,支援 HTTP/HTTPS、FTP、FTPS、SFTP、LDAP、MQTT 等協議,提供精細的請求控制(Header、Cookie、代理、SSL、超時、斷點續傳、多線程並發),是 API 對接、爬蟲、微服務通信的標準選擇。
curl_init() 初始化會話,返回句柄 $chcurl_setopt() / curl_setopt_array() 設置選項curl_exec() 執行請求curl_close() 釋放資源resource curl_init ( [ string $url = null ] )
bool curl_setopt ( resource $ch, int $option, mixed $value )
bool curl_setopt_array ( resource $ch, array $options )
mixed curl_exec ( resource $ch )
void curl_close ( resource $ch )
| 類別 | 選項常量 | 說明 |
|---|---|---|
| URL/請求 | CURLOPT_URL | 目標 URL |
| CURLOPT_CUSTOMREQUEST | 自定義方法(GET/POST/PUT/DELETE/PATCH) | |
| CURLOPT_POST | true=POST 請求 | |
| CURLOPT_POSTFIELDS | POST 數據(陣列=multipart/form-data,字符串=application/x-www-form-urlencoded) | |
| Header/Cookie | CURLOPT_HTTPHEADER | 自定義 Header 陣列 |
| CURLOPT_COOKIE | 發送 Cookie 字符串 | |
| CURLOPT_COOKIEJAR | 保存響應 Cookie 到文件 | |
| CURLOPT_COOKIEFILE | 從文件讀取 Cookie 發送 | |
| SSL/安全 | CURLOPT_SSL_VERIFYPEER | 驗證服務器證書(生產必須 true) |
| CURLOPT_SSL_VERIFYHOST | 驗證宿主名(2=嚴格) | |
| CURLOPT_CAINFO | CA 證書文件路徑 | |
| CURLOPT_SSLCERT/SSLKEY | 客戶端證書/私鑰(雙向 TLS) | |
| 超時/限制 | CURLOPT_TIMEOUT | 總超時秒數 |
| CURLOPT_CONNECTTIMEOUT | 連接超時秒數 | |
| CURLOPT_MAXREDIRS | 最大重定向次數 | |
| CURLOPT_BUFFERSIZE | 讀寫緩衝區大小 | |
| 輸出控制 | CURLOPT_RETURNTRANSFER | true=返回字符串,false=直接輸出 |
| CURLOPT_HEADER | true=包含響應 Header | |
| CURLOPT_WRITEFUNCTION | 自定義寫入回調(流式處理) |
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/users');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
if ($response === false) {
echo "錯誤: " . curl_error($ch);
} else {
$data = json_decode($response, true);
print_r($data);
}
curl_close($ch);
?>
<?php
$ch = curl_init('https://api.example.com/orders');
$payload = json_encode(['user_id' => 123, 'items' => [['sku' => 'A001', 'qty' => 2]]]);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $access_token,
'Accept: application/json'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_SSL_VERIFYPEER => true, // 生產環境必須開啟
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
?>
<?php
$ch = curl_init('https://api.example.com/upload');
$cfile = new CURLFile('/path/to/image.jpg', 'image/jpeg', 'photo.jpg'); // PHP 5.5+
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => ['file' => $cfile, 'user_id' => 123],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
?>
<?php
$ch = curl_init('https://cdn.example.com/large.iso');
$fp = fopen('/tmp/large.iso', 'wb');
curl_setopt_array($ch, [
CURLOPT_FILE => $fp, // 直接寫入文件句柄
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 0, // 無總超時
CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_NOPROGRESS => false,
CURLOPT_PROGRESSFUNCTION => function($ch, $dltotal, $dlnow, $ultotal, $ulnow) {
if ($dltotal > 0) printf("\r下載進度: %.2f%%", $dlnow/$dltotal*100);
}
]);
curl_exec($ch);
fclose($fp);
curl_close($ch);
?>
<?php
$urls = ['https://api1.example.com', 'https://api2.example.com', 'https://api3.example.com'];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$handles[$url] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh, 0.1); // 等待活動
} while ($running > 0);
foreach ($handles as $url => $ch) {
$response = curl_multi_getcontent($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "$url: HTTP $http_code\n";
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
?>
$ch,保持 Keep-Alive 連接,減少握手開銷。CURLOPT_DNS_CACHE_TIMEOUT(默認 120s)避免頻繁解析。CURLOPT_PINNEDPUBLICKEY 防中間人攻擊。curl_errno()、curl_error()、curl_getinfo($ch, CURLINFO_HTTP_CODE) 三重檢查。curl_close() 重建句柄,釋放 libcurl 內部緩存。