核心封裝函數
<?php
header("Content-type: text/html; charset=utf-8");
/**
* cURL POST 請求封裝
* @param array $header HTTP 標頭陣列
* @param string $data POST 數據(application/x-www-form-urlencoded 格式)
* @param string $url 目標 URL
* @return string|int 回應內容或 0(失敗)
*/
function curl_post($header, $data, $url)
{
$ch = curl_init();
$res = curl_setopt($ch, CURLOPT_URL, $url);
var_dump($res); // 調試用,生產環境建議移除
// SSL 設定(開發/測試環境常需關閉驗證)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, 0); // 不輸出回應 Header
curl_setopt($ch, CURLOPT_POST, 1); // POST 請求
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // POST 數據
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回字符串而非直接輸出
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // 自定義 Header
$result = curl_exec($ch);
curl_close($ch);
if ($result === false || $result === null) {
return 0;
}
return $result;
}
// 使用示例
$url = 'https://127.0.0.1';
$header = array(
"Host: 127.0.0.1",
"Content-Type: application/x-www-form-urlencoded",
'Referer: https://127.0.0.1/toolindex.xhtml',
'User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2;)'
);
$data = 'tools_id=1&env=gamma';
echo "argv: $data<br>";
$ret = curl_post($header, $data, $url);
// 編碼轉換:假設服務端返回 GB2312,轉為 UTF-8 顯示
$utf8 = iconv('GB2312', 'UTF-8//IGNORE', $ret);
echo 'return:<br>' . nl2br($utf8) . '<br>';
?>
關鍵參數詳解
| 選項 | 作用 | 常用值 |
| CURLOPT_URL | 請求目標地址 | 字符串 |
| CURLOPT_POST | 啟用 POST | 1 (true) |
| CURLOPT_POSTFIELDS | POST 數據 | 字符串或陣列 |
| CURLOPT_RETURNTRANSFER | 返回結果不直接輸出 | 1 (true) |
| CURLOPT_HTTPHEADER | 自定義請求標頭 | 陣列 |
| CURLOPT_SSL_VERIFYPEER | 驗證 SSL 證書 | 0 (關閉,測試用) |
| CURLOPT_TIMEOUT | 超時秒數 | 整數(建議 30) |
| CURLOPT_FOLLOWLOCATION | 跟隨重定向 | 1 (true) |
進階用法提示
- 發送 JSON:將
Content-Type 設為 application/json,$data = json_encode($arr)
- 檔案上傳:PHP 5.5+ 使用
new CURLFile($path, $mime, $name);舊版用 @$path(已棄用)
- 錯誤處理:用
curl_error($ch) 獲取錯誤信息,curl_getinfo($ch, CURLINFO_HTTP_CODE) 獲取 HTTP 狀態碼
- 複用連接:長運行腳本中可保持
$ch 實例複用,減少握手開銷
常見問題排查
- 返回亂碼:確認服務端編碼,用
iconv 或 mb_convert_encoding 轉換
- SSL 錯誤:生產環境請配置 CA 證書路徑(
CURLOPT_CAINFO),勿長期關閉驗證
- 空白回應:檢查
curl_error(),確認防火牆/代理設置,嘗試設定 CURLOPT_USERAGENT