核心函數速查表
| 函數 | 用途 |
| curl_init() | 初始化 cURL 會話,返回句柄 |
| curl_setopt() | 設定單一選項 |
| curl_setopt_array() | 批次設定選項 (陣列) |
| curl_exec() | 執行會話 |
| curl_getinfo() | 取得傳輸資訊 (HTTP 碼、耗時等) |
| curl_error()/curl_errno() | 取得錯誤訊息/代碼 |
| curl_close() | 關閉會話釋放資源 |
基礎 GET 請求範例
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/data');
curl_setopt($ch, CURLOPT_HEADER, 0); // 不包含回應標頭
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回字串而非直接輸出
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 超時 10 秒
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 開發環境跳過 SSL 驗證
$response = curl_exec($ch);
if (curl_errno($ch)) {
error_log('cURL 錯誤: ' . curl_error($ch));
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
var_dump($response);
?>
POST 資料提交
<?php
$postData = [
'phone' => '13800138000',
'message' => '測試訊息',
'action' => 'send'
];
$ch = curl_init('https://api.example.com/sms/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); // 自動編碼
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/x-www-form-urlencoded',
'User-Agent: MyApp/1.0'
]);
$response = curl_exec($ch);
curl_close($ch);
?>
使用 Proxy 代理
<?php
$ch = curl_init('https://httpbin.org/ip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com:1080');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'username:password'); // 若需認證
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); // 或 SOCKS5
$response = curl_exec($ch);
curl_close($ch);
?>
模擬登入 Discuz (含 Cookie 管理)
<?php
$discuzUrl = 'https://bbs.example.com';
$loginUrl = $discuzUrl . '/member.php?mod=logging&action=login&loginsubmit=yes';
$targetUrl = $discuzUrl . '/home.php?mod=spacecp&ac=profile';
$cookieFile = __DIR__ . '/cookie.txt';
// 1. 取得 formhash
$ch = curl_init($loginUrl);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_SSL_VERIFYPEER => false,
]);
$html = curl_exec($ch);
curl_close($ch);
preg_match('/name="formhash" value="([^"]+)"/', $html, $matches);
$formhash = $matches[1] ?? '';
// 2. 提交登入
$postData = [
'formhash' => $formhash,
'username' => 'your_username',
'password' => 'your_password',
'questionid' => 0,
'answer' => '',
'loginsubmit' => 'true'
];
$ch = curl_init($loginUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($postData),
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_COOKIEFILE => $cookieFile,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false,
]);
curl_exec($ch);
curl_close($ch);
// 3. 攜帶 Cookie 訪問需登入頁面
$ch = curl_init($targetUrl);
curl_setopt_array($ch, [
CURLOPT_COOKIEFILE => $cookieFile,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
]);
$content = curl_exec($ch);
curl_close($ch);
echo $content;
?>
多執行緒並發請求 (curl_multi)
<?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_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_multi_add_handle($mh, $ch);
$handles[$url] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
$results = [];
foreach ($handles as $url => $ch) {
$results[$url] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
print_r($results);
?>
重要選項速查
| 選項 | 說明 |
| CURLOPT_TIMEOUT | 最大執行秒數 |
| CURLOPT_CONNECTTIMEOUT | 連線等待秒數 |
| CURLOPT_FOLLOWLOCATION | 自動跟隨重導向 |
| CURLOPT_MAXREDIRS | 最大重導向次數 |
| CURLOPT_USERAGENT | 設定 User-Agent |
| CURLOPT_HTTPHEADER | 自訂請求標頭陣列 |
| CURLOPT_SSL_VERIFYPEER | 驗證 SSL 憑證 (生產環境必須 true) |
| CURLOPT_CAINFO | 指定 CA 憑證路徑 |
最佳實踐總結
- 永遠設定
CURLOPT_TIMEOUT 防止阻塞
- 生產環境必須驗證 SSL 憑證
- 善用
curl_getinfo() 監控效能指標
- 重複請求重複使用句柄 (
curl_reset()) 提升效能
- 錯誤處理需區分網路錯誤、HTTP 錯誤、業務邏輯錯誤