程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 執行、獲取遠程代碼返回:file_get_contents 超時處理的問題詳解

執行、獲取遠程代碼返回:file_get_contents 超時處理的問題詳解

編輯:關於PHP編程

    天氣終於晴了,但問題來了。在實現兩個站點間用戶數據同步,當使用php函數 file_get_contents抓取執行遠程頁面時,如果連接超時將會輸出一個Fatal Error或相當的慢,結果導致下面的代碼不能運行。先了解一下PHP file_get_contents() 函數
    定義和用法
    file_get_contents() 函數把整個文件讀入一個字符串中。
    和 file() 一樣,不同的是 file_get_contents() 把文件讀入一個字符串。
    file_get_contents() 函數是用於將文件的內容讀入到一個字符串中的首選方法。如果操作系統支持,還會使用內存映射技術來增強性能。
    語法
    file_get_contents(path,include_path,context,start,max_length)參數 描述
    path 必需。規定要讀取的文件。
    include_path 可選。如果也想在 include_path 中搜尋文件的話,可以將該參數設為 "1"。
    context 可選。規定文件句柄的環境。
    context 是一套可以修改流的行為的選項。若使用 null,則忽略。
    start 可選。規定在文件中開始讀取的位置。該參數是 PHP 5.1 新加的。
    max_length 可選。規定讀取的字節數。該參數是 PHP 5.1 新加的。
    說明
    對 context 的支持是 PHP 5.0.0 添加的。
    針對超時或頁面過慢,一般可采取兩個解決方案:

    一. 利用file_get_contents()第三個參數

    復制代碼 代碼如下:
    $url = "http://zhoz.com/zhoz.php";
    $ctx = stream_context_create(array(
    ‘http' => array(‘timeout' => 10)
    )
    );
    $result = @file_get_contents($url, 0, $ctx);
    if($result){
    var_dump($result);
    }else{
    echo " Buffer is empty";
    }
    ?>


    此方法1,我經測試在本地反映良好,但如果在外網測試(環境:中國→美國服務器間)基本都是超時的情況。
    測試了TimeOut基本沒有用了,建議以下方式

    二. 使用curl擴展庫

    復制代碼 代碼如下:
    $url = "http://zhoz.com/zhoz.php";
    try {
    echo date(‘Y-m-d h:i:s');
    echo "";
    //$buffer = file_get_contents($url);
    $buffer = zhoz_get_contents($url);
    echo date(‘Y-m-d h:i:s');
    if(emptyempty($buffer)) {
    echo " Buffer is empty";
    } else {
    echo " Buffer is not empty";
    }
    } catch(Exception $e) {
    echo "error ";
    }
    function zhoz_get_contents($url, $second = 5) {
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_HEADER,0);
    curl_setopt($ch,CURLOPT_TIMEOUT,$second);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
    }
    ?>


    綜述,根據系統環境來選擇到底應用哪種方法:

    復制代碼 代碼如下:


    function vita_get_url_content($url) {
    if(function_exists(‘file_get_contents')) {
    $file_contents = file_get_contents($url);
    } else {
    $ch = curl_init();
    $timeout = 5;
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $file_contents = curl_exec($ch);
    curl_close($ch);
    }
    return $file_contents;
    }
    ?>

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved