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

PHP file_get_contents 超時處理與重試機制完整指南

     編輯:PHP 綜合知識

file_get_contents 超時控制與高可用策略

file_get_contents 從 PHP 5.0 起支援 context 參數,可精確控制 HTTP 行為(超時、POST、Header 等)。set_time_limit 僅限制腳本總執行時間,不影響網路讀取超時。

方法一:設定讀取超時(Context timeout)

$opts = [
    'http' => [
        'method' => 'GET',
        'timeout' => 3, // 秒
    ]
];
$context = stream_context_create($opts);

// 重試機制:最多嘗試 3 次
$cnt = 0;
while ($cnt < 3 && ($content = file_get_contents('https://example.com', false, $context)) === false) {
    $cnt++;
    usleep(200000); // 200ms 間隔
}

if ($content !== false) {
    echo '成功取得內容,長度:' . strlen($content);
} else {
    echo '重試 3 次仍失敗';
}

方法二:POST 請求與超時控制

function httpPost($url, array $data, $timeout = 10) {
    $context = [
        'http' => [
            'method' => 'POST',
            'timeout' => $timeout,
            'header' => 'Content-Type: application/x-www-form-urlencoded',
            'content' => http_build_query($data),
        ]
    ];
    return file_get_contents($url, false, stream_context_create($context));
}

// 使用範例
$response = httpPost('https://api.example.com/endpoint', [
    'name' => 'test',
    'email' => 'admin@example.com',
], 5);

支援 Context 的相關函數

  • fopen、file、fsockopen(建議搭配 stream_set_timeout)
  • curl 系列(有獨立的 CURLOPT_TIMEOUT、CURLOPT_CONNECTTIMEOUT)

最佳實踐建議

  1. 區分連線超時與讀取超時:Context timeout 僅控制讀取;若需控制連線階段,需用 fsockopen 或 cURL。
  2. 指數退避重試:sleep(pow(2, $retry) * 100000) 避免雪崩效應。
  3. 記錄失敗日誌:記錄 URL、錯誤訊息、重試次數,利於事後分析。
  4. 生產環境優先考慮 cURL:功能更完整、效能更穩定、支援並發(curl_multi)。

常見錯誤代碼對照

錯誤可能原因
Connection timed out防火牆阻擋、目標主機不可達、DNS 解析失敗
SSL certificate problemCA 憑證缺失、憑證過期、域名不符
HTTP 500/502/503/504伺服器端錯誤、閘道超時、服務不可用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved