功能特性
- 統一入口函數
getHttpContent() 支持 GET/POST
- 自動構建查詢字符串,支持數組參數
- 可配置超時、跟隨重定向、Cookie 文件
- 異常捕獲,失敗返回
null
完整代碼
<?php
/**
* 通用 HTTP 請求函數
* @param string $url 請求地址
* @param string $method 'GET' 或 'POST'
* @param array $postData POST 數據鍵值對
* @return string|false 響應體或 false
*/
function getHttpContent($url, $method = 'GET', $postData = []) {
if (empty($url)) return false;
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING => 'gzip,deflate', // 支持壓縮
CURLOPT_SSL_VERIFYPEER => false, // 開發環境跳過驗證
CURLOPT_SSL_VERIFYHOST => false,
]);
if (strtoupper($method) === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
}
$data = curl_exec($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
curl_close($ch);
if ($errno) {
error_log("cURL Error [$errno]: $error (URL: $url)");
return false;
}
return $data;
}
// 使用示例
$html = getHttpContent('https://api.example.com/users', 'GET');
$result = getHttpContent('https://api.example.com/login', 'POST', [
'username' => 'admin',
'password' => 'secret'
]);
?>
進階擴展建議
- Cookie 持久化:添加
CURLOPT_COOKIEJAR/CURLOPT_COOKIEFILE 參數實現會話保持。
- 自定義 Header:通過
CURLOPT_HTTPHEADER 設置 Token、User-Agent 等。
- 並發請求:使用
curl_multi_* 系列函數實現並發。
- 重試機制:封裝指數退避重試邏輯,提高可用性。
- PSR-7 兼容:返回
Psr\Http\Message\ResponseInterface 便於框架集成。
常見錯誤排查
| 現象 | 可能原因 | 解決 |
| 返回 false | 域名解析失敗/連接超時 | 檢查 DNS、防火牆、超時設置 |
| 空白響應 | HTTPS 證書驗證失敗 | 設置 CURLOPT_SSL_VERIFYPEER => false 或配置 CA 憑證 |
| 亂碼 | 編碼不匹配 | 檢查 CURLOPT_ENCODING 及響應 Content-Type charset |
| 403 Forbidden | 反爬蟲/缺少 Header | 模擬瀏覽器 UA、Referer、Cookie |