回覆列表
  • 1 # 程式設計師小助手

    引言

    前天的文章,我們說到了如何高效的下載網路資源,對於小體積的檔案。可以便捷的使用 file_put_contents() 進行請求。與之配對的函式 file_get_contents() 則是讀取資源。

    學習時間

    上一段中我們已經提示了,有一個函式可以用於讀取網路資源,也就是間接的發起網路請求。預設 file_get_contents()是使用 GET 請求,如果是POST請求按道理也應該做的來。不過要怎麼寫呢?

    file_get_contents() 函式是用來將檔案的內容讀入到一個字串中的首選方法。如果作業系統支援還會使用記憶體對映技術來增強效能。

    其引數形式如下:

    string file_get_contents( string $filename[, bool $use_include_path = false[, resource $context[, int $offset = -1[, int $maxlen]]]] )

    複雜的功能,我們需要組裝後面的引數即可。我們需要使用流操作的上下文 context,傳入該函式。

    首先構造請求的引數,也就是鍵值對,這裡需要使用 & 進行多引數連線:

    $postdata = http_build_query( array( "name" => "joe", "age" => "13" ) );

    接著構造請求結構體:

    $opts = array("http" => array( "method" => "POST", "header" => "Content-Type: application/x-www-form-urlencoded", "content" => $postdata ) );

    最重要的一步,建立基於流的上下文,使用

    $context = stream_context_create($opts);

    寫到這裡就“萬事俱備只欠東風”了。我們隆重地清楚主旨函式處理這些引數:

    $result = file_get_contents("http://example.com/submit.php", false, $context);

    之後結果,或者錯誤內容,就會輸出到 $result 物件。使用 false 判斷,或者使用已知的介面返回資料型別,進一步處理。

    深度定製

    上一節的內容並沒有考慮網路超時,介面授權,等等情形。本節我們說一個複雜度高一些的,要求處理一個https請求,並配置了 basic auth 的 url,並使用 post 上傳資料。

    首先還是裁剪請求體:

    $opts = array("http" => array( "method" => "POST", "header" => "Content-Type: text/xml\r\n.Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n", "content" => $body, "timeout" => 60 ) );

    注意我們在請求上添加了 header,這是根據目標 url 的要求新增的。$body 就是上一節中的 $postdata 結構型別。

    接著建立流上下文:

    $context = stream_context_create($opts);

    最後呼叫函式:

    $url = "https://".$https_server;

    $result = file_get_contents($url, false, $context, -1, 40000);

    寫在最後

    透過上面兩個細節的函式處理,大家是不是對 file_get_contents() 有了更加深入的看法,原來這傢伙還可以這麼用,真是開了眼界!

    Happy coding :_)

  • 中秋節和大豐收的關聯?
  • 吻別英文歌詞解釋?