使用了笨重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' => http_build_query($info), 'timeout' => 20 ) )); $result = file_get_contents($url, false, $context);
如果您覺得本文對您有幫助,您可以推薦或關注我,另外,如果有什么問題,可以在下方留言討論,謝謝。