1. 程式人生 > >PHP模擬傳送POST請求之四、加強file_get_contents()傳送POST請求

PHP模擬傳送POST請求之四、加強file_get_contents()傳送POST請求

使用了笨重fsockopen()方法後,我們開始在PHP函式庫裡尋找更簡單的方式來進行POST請求,這時,我們發現了PHP的檔案函式也具有與遠端URL互動的功能。

最簡單的是fopen()和fread()函式。

複製程式碼
$fp=fopen('http://localhost?query=query','r');

$content=fread($fp,1024);

echo $content;//輸出HTML文件資訊

fclose($fp);
複製程式碼

然後是file_get_contents()函式:

$content=file_get_contents('http://localhost?query=query');

echo $content;//輸出HTML文件資訊

但是,我們會發現,通這兩種方式我們只能通過GET方式傳送資訊並讀取網頁資訊,而且,這兩種方式還面臨著超時,無法處理頭資訊等問題。

不過,我們仔細檢視file_get_contents()的函式原型:

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

我們發現它還有其他可選引數,我們可以通過這些引數的設定,在傳送網頁請求的同時,POST出我們的資料,下面來解釋各個引數的意義。

  • $filename:不用多說,填寫我們要訪問的URL字串就行。
  • $use_include_path:是否使用檔案之前include_path()設定的路徑,如果使用,在檔案地址找不到時,會自動去include_path()設定的路徑去尋找,網頁地址中我們設定為false。
  • $context:環境上下文,resource型別,由函式 stream_context_create() 返回的 context來設定,也是我們進行file_get_contents()函式擴充套件的重點,接下來再說。
  • $offset:讀取的內容相對檔案開始內容的偏移位元組,我們讀取網頁內容,要保證HTML文件的完整性,所以可以設定為0或者不設定,預設為0。
  • $maxlen:顧名思義,是讀取檔案的最大位元組數,同offset我們不設定,讀取網頁的全部內容。

通過file_get_contents傳送POST請求的重點就在$context引數上面,我們用stream_context_create()函式設定上下文。

stream_context_create()建立的上下文選項即可用於流(stream),也可用於檔案系統(file system)。對於像 file_get_contents()、file_put_contents()、readfile()直接使用檔名操作而沒有檔案控制代碼的函式來說更有用。stream_context_create()增加header頭只是一部份功能,還可以定義代理、超時等。

我們來看stream_context_create()函式的原型:

resource stream_context_create ([ array $options [, array $params ]] )

我們看到,通過傳入設定陣列用此函式來獲取一個資源型別的上下文選項。

複製程式碼
$context = stream_context_create(array(                     //傳入陣列型別的$option引數

    'http' => array(                              //以HTTP請求為鍵的設定陣列

        'method'  => 'POST',                         //設定請求方法為POST

        'header'  => "Content-type: application/x-www-form-urlencoded",//通過設定標頭檔案來設定POST資料格式

        'content' => http_build_query($query_info),           //用http_build_query()方法將陣列拼合成資料字串

        'timeout' => 20                              //設定請求的超時時間。

    ) 

)); 
複製程式碼

設定好上下文,我們通過file_get_contents()函式進行POST資料提交。

$results = file_get_contents('http://localhost', false, $context); 

下面是POST請求的完整示例: 

複製程式碼
$info=['eat'=>'2kg','run'=>'10km'] ;

$url='http://localhost';

$context = stream_context_create(array(  

    'http' => array(  

        'method' => 'POST',  

        'header' => 'Content-type:application/x-www-form-urlencoded',
  
        'content' => html_build_query($info),  

        'timeout' => 20  

    )  

));  

$result = file_get_contents($url, false, $context);
複製程式碼