兩大核心函數對比
| 特性 | file_get_contents() | cURL |
| 語法簡潔度 | 極簡單行 | 需初始化/設定/執行/關閉 |
| 預設啟用 | 需 allow_url_fopen=On | 需編譯 --with-curl、載入擴充 |
| 虛擬主機限制 | 常被關閉 | 較少被限制 |
| 功能豐富度 | 僅 GET、簡易 POST | 完整 HTTP 協定、Header、Cookie、Proxy、SSL、斷點續傳 |
| 錯誤處理 | 回傳 false,需 error_get_last() | curl_error(), curl_errno(), curl_getinfo() |
| 超時控制 | stream_context 設定 | CURLOPT_TIMEOUT, CURLOPT_CONNECTTIMEOUT |
file_get_contents() 基礎用法
$url = 'https://api.example.com/data';
$context = stream_context_create([
'http' => [
'timeout' => 10,
'method' => 'GET',
'header' => "User-Agent: MyApp/1.0\r\nAccept: application/json\r\n"
]
]);
$content = @file_get_contents($url, false, $context);
if ($content === false) {
// 處理失敗
}
cURL 完整範本
function curlGet($url, $options = []) {
$ch = curl_init();
$defaults = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MyBot/1.0)',
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
];
curl_setopt_array($ch, $defaults + $options);
$data = curl_exec($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
$info = curl_getinfo($ch);
curl_close($ch);
return [$data, $errno, $error, $info];
}
最佳實踐:雙重備援函數
function fetchUrl($url) {
// 1. 優先嘗試 file_get_contents(效能較好)
if (function_exists('file_get_contents') && ini_get('allow_url_fopen')) {
$content = @file_get_contents($url);
if ($content !== false) return $content;
}
// 2. 回退 cURL
if (function_exists('curl_init')) {
list($data, $errno) = curlGet($url);
if ($errno === 0) return $data;
}
// 3. 兩者皆失敗
throw new RuntimeException("無法抓取遠端資源: $url");
}
常見坑點提醒
- SSL 憑證驗證失敗:開發環境可暫時關閉
CURLOPT_SSL_VERIFYPEER,生產環境務必開啟並配置 CA 憑證
- 重導向循環:設定
CURLOPT_MAXREDIRS 防止無限跳轉
- 大檔案記憶體爆炸:改用
CURLOPT_WRITEFUNCTION 串流寫入檔案
- 編碼問題:回應可能非 UTF-8,需配合
mb_detect_encoding() + iconv() 處理