首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 遠端內容抓取:file_get_contents() 與 cURL 完整對比與容錯策略

     編輯:PHP 相關知識

兩大核心函數對比

特性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() 處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved