有時候,咱們須要在服務器端模擬 POST/GET 等請求,也就是在 PHP 程序中去實現模擬,改怎麼作到呢?或者說,在 PHP 程序裏,給你一個數組,如何將這個數組 POST/GET 到另一個地址呢?固然,使用 CURL 很容易辦到,那麼若是不使用 CURL 庫,又該怎麼辦呢?其實,在 PHP 裏已經有相關的函數實現了,這個函數就是接下來要講的 stream_context_create()。html
直接 show you the code,這是最好的方法:web
01 |
$data = array ( |
02 |
'foo' => 'bar' , |
03 |
'baz' => 'boom' , |
04 |
'site' => 'www.nowamagic.net' , |
05 |
'name' => 'nowa magic' ); |
06 |
|
07 |
$data = http_build_query( $data ); |
08 |
09 |
//$postdata = http_build_query($data); |
10 |
$options = array ( |
11 |
'http' => array ( |
12 |
'method' => 'POST' , |
13 |
'header' => 'Content-type:application/x-www-form-urlencoded' , |
14 |
'content' => $data |
15 |
//'timeout' => 60 * 60 // 超時時間(單位:s) |
16 |
) |
17 |
); |
18 |
19 |
$url = "http://www.nowamagic.net/test2.php" ; |
20 |
$context = stream_context_create( $options ); |
21 |
$result = file_get_contents ( $url , false, $context ); |
22 |
23 |
echo $result ; |
http://www.nowamagic.net/test2.php 的代碼爲:數據庫
1 |
$data = $_POST ; |
2 |
3 |
echo '<pre>' ; |
4 |
print_r( $data ); |
5 |
echo '</pre>' ; |
運行結果爲:swift
1 |
Array |
2 |
( |
3 |
[foo] => bar |
4 |
[baz] => boom |
5 |
[site] => www.nowamagic.net |
6 |
[name] => nowa magic |
7 |
) |
一些要點講解:數組
1. 以上程序用到了 http_build_query() 函數,若是須要了解,能夠參看 PHP函數補完:http_build_query()構造URL字符串。服務器
2. stream_context_create() 是用來建立打開文件的上下文件選項的,好比用POST訪問,使用代理,發送header等。就是 建立一個流,再舉一個例子吧:app
01 |
$context = stream_context_create( array ( |
02 |
'http' => array ( |
03 |
'method' => 'POST' , |
04 |
'header' => sprintf( "Authorization: Basic %s\r\n" , base64_encode ( $username . ':' . $password )). |
05 |
"Content-type: application/x-www-form-urlencoded\r\n" , |
06 |
'content' => http_build_query( array ( 'status' => $message )), |
07 |
'timeout' => 5, |
08 |
), |
09 |
)); |
10 |
$ret = file_get_contents ( 'http://twitter.com/statuses/update.xml' , false, $context ); |
3. stream_context_create建立的上下文選項便可用於流(stream),也可用於文件系統(file system)。對於像 file_get_contents、file_put_contents、readfile直接使用文件名操做而沒有文件句柄的函數來講更有用。stream_context_create增長header頭只是一部份功能,還能夠定義代理、超時等。這使得訪問web的功能不弱於curl。curl
4. stream_context_create() 做用:建立並返回一個文本數據流並應用各類選項,可用於fopen(),file_get_contents()等過程的超時設置、代理服務器、請求方式、頭信息設置的特殊過程。函數
5. stream_context_create 還能經過增長 timeout 選項解決file_get_contents超時處理:
01 |
$opts = array ( |
02 |
'http' => array ( |
03 |
'method' => "GET" , |
04 |
'timeout' =>60, |
05 |
) |
06 |
); |
07 |
//建立數據流上下文 |
08 |
$context = stream_context_create( $opts ); |
09 |
10 |
$html = file_get_contents ( 'http://www.nowamagic.net' , false, $context ); |
11 |
12 |
//fopen輸出文件指針處的全部剩餘數據: |
13 |
//fpassthru($fp); //fclose()前使用 |