在 PHP 開發中,cURL 是處理 HTTP 請求最強大且靈活的工具之一。本文提供一個封裝良好的 Curl 類,支援 GET 請求、POST 表單提交以及遠端檔案下載三大核心功能,並內建 Cookie 管理與 SSL 憑證處理,可直接應用於爬蟲、API 串接、自動化測試等場景。
該類採用單一職責原則,將三種操作封裝為獨立方法:
<?php
class Curl {
/**
* GET 方式請求指定 URL
* @param string $url 目標網址
* @param string $cookie Cookie 檔案路徑(可選)
* @return string 回應內容
*/
public function get($url, $cookie = '') {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
if (!empty($cookie)) {
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
}
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
$tmp = curl_exec($curl);
curl_close($curl);
return $tmp;
}
/**
* POST 方式模擬表單提交
* @param string $url 目標網址
* @param array $params 表單欄位陣列
* @param string $cookie Cookie 儲存路徑
* @return string 回應內容
*/
public function post($url, $params, $cookie) {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] ?? 'PHP cURL');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
/**
* 遠端檔案下載至本地
* @param string $remote 遠端檔案 URL
* @param string $local 本地儲存路徑
* @param string $cookie Cookie 檔案路徑(可選)
* @return void
*/
public function reutersload($remote, $local, $cookie = '') {
$cp = curl_init($remote);
$fp = fopen($local, "w");
curl_setopt($cp, CURLOPT_FILE, $fp);
curl_setopt($cp, CURLOPT_HEADER, 0);
if ($cookie != '') {
curl_setopt($cp, CURLOPT_COOKIEFILE, $cookie);
}
curl_exec($cp);
curl_close($cp);
fclose($fp);
}
}
CURLOPT_SSL_VERIFYPEER = false:跳過對等憑證驗證,適用於自簽憑證或測試環境CURLOPT_SSL_VERIFYHOST = 1:僅檢查憑證中是否存在 Common Name,不驗證其有效性GET 使用 CURLOPT_COOKIEFILE 讀取現有 Cookie;POST 使用 CURLOPT_COOKIEJAR 寫入/更新 Cookie,實現會話保持。
http_build_query() 將關聯陣列轉為 application/x-www-form-urlencoded 格式;若欄位值為陣列,自動切換為 multipart/form-data 支援檔案上傳(檔案名前加 @ 前綴)。
<?php
$curl = new Curl();
// GET 請求範例
$html = $curl->get('https://api.example.com/users', 'cookies.txt');
// POST 登入範例
$loginData = ['username' => 'admin', 'password' => 'secret'];
$response = $curl->post('https://example.com/login', $loginData, 'cookies.txt');
// 下載受保護圖片
$curl->reutersload('https://example.com/protected/image.png', './downloads/image.png', 'cookies.txt');
CURLOPT_SSL_VERIFYPEER 並配合 CURLOPT_CAINFO 指定 CA 憑證束CURLOPT_TIMEOUT 與 CURLOPT_CONNECTTIMEOUT 防止阻塞CURLOPT_PROGRESSFUNCTION 實現進度條顯示這個 Curl 類以簡潔的介面封裝了最常用的 HTTP 操作,程式碼結構清晰、註釋完整,適合作為專案基礎元件或學習參考。實際部署時請根據安全需求調整 SSL 驗證策略,並妥善管理 Cookie 檔案權限。