通用 cURL 方法
<?php
class HttpClient {
/**
* 統一請求入口
* @param string|array $url 字串或 ['https_url', ...] 觸發 SSL 設定
* @param array|null $header 自訂 Header 陣列
* @param array|null $post POST 欄位陣列
* @param int $cookie 0=不處理 1=存 Cookie 2=送 Cookie
* @return string|false 回應內容
*/
public function request($url, $header = null, $post = null, $cookie = 0) {
$isHttps = is_array($url);
$target = $isHttps ? $url[0] : $url;
$ch = curl_init($target);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => $isHttps ? false : true,
CURLOPT_SSL_VERIFYHOST => $isHttps ? false : 2,
]);
if ($header) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
if ($post) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
}
if ($cookie === 1) curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
if ($cookie === 2) curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
$data = curl_exec($ch);
if (curl_errno($ch)) {
error_log('cURL Error: ' . curl_error($ch));
$data = false;
}
curl_close($ch);
return $data;
}
// 便利方法
public function get($url, $header = null) { return $this->request($url, $header); }
public function post($url, array $data, $header = null) { return $this->request($url, $header, $data); }
}
使用範例
$http = new HttpClient();
// 簡單 GET
$html = $http->get('https://api.example.com/users');
// POST 登入並保存 Cookie
$http->post('https://site.com/login', ['user'=>'a','pwd'=>'b'], null, 1);
// 攜帶 Cookie 訪問會員頁
$page = $http->request(['https://site.com/profile'], null, null, 2);
// 自訂 Header(如 API Token)
$header = ['Authorization: Bearer ' . $token, 'Accept: application/json'];
$json = $http->request('https://api.example.com/data', $header);
進階提示
- 生產環境請啟用
CURLOPT_SSL_VERIFYPEER => true 並配置 CA 憑證。
- 長連線可重複使用
$ch(單例模式)提升效能。
- 錯誤處理建議拋出例外而非回傳 false。
- 大檔案下載改用
CURLOPT_WRITEFUNCTION 串流寫入磁碟。