引言
前天的文章,我們說到了如何高效的下載網路資源,對於小體積的檔案。可以便捷的使用 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 結構型別。
接著建立流上下文:
最後呼叫函式:
$url = "https://".$https_server;
$result = file_get_contents($url, false, $context, -1, 40000);
透過上面兩個細節的函式處理,大家是不是對 file_get_contents() 有了更加深入的看法,原來這傢伙還可以這麼用,真是開了眼界!
Happy coding :_)
引言
前天的文章,我們說到了如何高效的下載網路資源,對於小體積的檔案。可以便捷的使用 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 :_)