国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP模擬發(fā)送POST請(qǐng)求之四、加強(qiáng)file_get_contents()發(fā)送POST請(qǐng)求

Original 2016-11-11 15:44:22 495
abstract:使用了笨重fsockopen()方法后,我們開始在PHP函數(shù)庫(kù)里尋找更簡(jiǎn)單的方式來進(jìn)行POST請(qǐng)求,這時(shí),我們發(fā)現(xiàn)了PHP的文件函數(shù)也具有與遠(yuǎn)程URL交互的功能。最簡(jiǎn)單的是fopen()和fread()函數(shù)。$fp=fopen('http://localhost?query=query','r'); $content=fread($fp,1024); echo&

使用了笨重fsockopen()方法后,我們開始在PHP函數(shù)庫(kù)里尋找更簡(jiǎn)單的方式來進(jìn)行POST請(qǐng)求,這時(shí),我們發(fā)現(xiàn)了PHP的文件函數(shù)也具有與遠(yuǎn)程URL交互的功能。

最簡(jiǎn)單的是fopen()和fread()函數(shù)。

$fp=fopen('http://localhost?query=query','r');

$content=fread($fp,1024);

echo $content;//輸出HTML文檔信息

fclose($fp);

然后是file_get_contents()函數(shù):

$content=file_get_contents(' 
echo $content;//輸出HTML文檔信息

但是,我們會(huì)發(fā)現(xiàn),通這兩種方式我們只能通過GET方式發(fā)送信息并讀取網(wǎng)頁(yè)信息,而且,這兩種方式還面臨著超時(shí),無法處理頭信息等問題。


不過,我們仔細(xì)查看file_get_contents()的函數(shù)原型:

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

我們發(fā)現(xiàn)它還有其他可選參數(shù),我們可以通過這些參數(shù)的設(shè)置,在發(fā)送網(wǎng)頁(yè)請(qǐng)求的同時(shí),POST出我們的數(shù)據(jù),下面來解釋各個(gè)參數(shù)的意義。

  • $filename:不用多說,填寫我們要訪問的URL字符串就行。

  • $use_include_path:是否使用文件之前include_path()設(shè)置的路徑,如果使用,在文件地址找不到時(shí),會(huì)自動(dòng)去include_path()設(shè)置的路徑去尋找,網(wǎng)頁(yè)地址中我們?cè)O(shè)置為false。

  • $context:環(huán)境上下文,resource類型,由函數(shù) stream_context_create() 返回的 context來設(shè)置,也是我們進(jìn)行file_get_contents()函數(shù)擴(kuò)展的重點(diǎn),接下來再說。

  • $offset:讀取的內(nèi)容相對(duì)文件開始內(nèi)容的偏移字節(jié),我們讀取網(wǎng)頁(yè)內(nèi)容,要保證HTML文檔的完整性,所以可以設(shè)置為0或者不設(shè)置,默認(rèn)為0。

  • $maxlen:顧名思義,是讀取文件的最大字節(jié)數(shù),同offset我們不設(shè)置,讀取網(wǎng)頁(yè)的全部?jī)?nèi)容。


通過file_get_contents發(fā)送POST請(qǐng)求的重點(diǎn)就在$context參數(shù)上面,我們用stream_context_create()函數(shù)設(shè)置上下文。

stream_context_create()創(chuàng)建的上下文選項(xiàng)即可用于流(stream),也可用于文件系統(tǒng)(file system)。對(duì)于像 file_get_contents()、file_put_contents()、readfile()直接使用文件名操作而沒有文件句柄的函數(shù)來說更有用。stream_context_create()增加header頭只是一部份功能,還可以定義代理、超時(shí)等。

我們來看stream_context_create()函數(shù)的原型:

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

我們看到,通過傳入設(shè)置數(shù)組用此函數(shù)來獲取一個(gè)資源類型的上下文選項(xiàng)。

$context = stream_context_create(array(                     //傳入數(shù)組類型的$option參數(shù)

    'http' => array(                              //以HTTP請(qǐng)求為鍵的設(shè)置數(shù)組

        'method'  => 'POST',                         //設(shè)置請(qǐng)求方法為POST

        'header'  => "Content-type: application/x-www-form-urlencoded",//通過設(shè)置頭文件來設(shè)置POST數(shù)據(jù)格式

        'content' => http_build_query($query_info),           //用http_build_query()方法將數(shù)組拼合成數(shù)據(jù)字符串

        'timeout' => 20                              //設(shè)置請(qǐng)求的超時(shí)時(shí)間。

    ) 

));

設(shè)置好上下文,我們通過file_get_contents()函數(shù)進(jìn)行POST數(shù)據(jù)提交。

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

下面是POST請(qǐng)求的完整示例: 

$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);


Release Notes

Popular Entries