最簡單的方式,需 allow_url_fopen=On:
$url = 'https://example.com/api'; $html = file_get_contents($url); echo $html;
✅ 簡潔易用 ❌ 無法自訂 Header、超時、POST 資料
較底層的串流操作,可讀取 Header 資訊:
$fp = fopen('https://example.com/api', 'r');
$meta = stream_get_meta_data($fp);
$result = '';
while (!feof($fp)) {
$result .= fgets($fp, 1024);
}
fclose($fp);
echo "Header: "; print_r($meta);
echo "Body: $result";
✅ 可獲取回應 Header ❌ 程式碼冗長、錯誤處理繁瑣
利用串流上下文發送 POST 資料:
$data = http_build_query([
'foo' => 'bar',
'site' => 'example.com'
]);
$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $data,
'timeout' => 30
]
];
$context = stream_context_create($options);
$result = file_get_contents('https://example.com/api', false, $context);
echo $result;
✅ 原生支援 POST、Header 自訂 ❌ 複雜請求(檔案上傳、Cookie 管理)較困難
功能最完整、效能最佳的 HTTP 客戶端:
$ch = curl_init('https://example.com/api?site=example.com');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
CURLOPT_SSL_VERIFYPEER => false, // 僅測試環境使用
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error: ' . curl_error($ch);
}
curl_close($ch);
echo $response;
✅ 支援 HTTPS、Cookie、Proxy、斷點續傳、並發請求、詳細錯誤資訊 ❌ 需安裝擴充套件
| 場景 | 推薦方法 |
|---|---|
| 簡單 GET、配置受限環境 | file_get_contents() |
| 需自訂 Header、POST 表單 | stream_context + file_get_contents() |
| 生產環境、複雜需求、高併發 | cURL |
| 需檢查回應 Header、串流處理 | fopen() 串流 |
CURLOPT_POSTFIELDS:POST 資料(陣列自動編碼為 multipart/form-data)CURLOPT_HTTPHEADER:自訂請求 Header 陣列CURLOPT_COOKIEJAR/COOKIEFILE:Cookie 持久化CURLOPT_PROXY:代理伺服器CURLOPT_WRITEFUNCTION:自訂回應寫入回調(大檔案下載)