php請求遠端url內容方法
php請求遠端url內容有兩個方法fopen/file_get_contents和curl。
1,fopen/file_get_contents與curl的差異
(1)fopen /file_get_contents 每次請求都會重新做DNS查詢,並不對DNS資訊進行快取。但是CURL會自動對DNS資訊進行快取。對同一域名下的網頁或者圖片的請求只需要一次DNS查詢。這大大減少了DNS查詢的次數。所以CURL的效能比fopen /file_get_contents 好很多。
(2)fopen /file_get_contents在請求HTTP時,使用的是http_fopen_wrapper,不會keeplive。而curl卻可以。這樣在多次請求多個連結時,curl效率會好一些。
(3)curl可以模擬多種請求,例如:POST資料,表單提交等,使用者可以按照自己的需求來定製請求。而fopen / file_get_contents只能使用get方式獲取資料。
2,如果遠端伺服器關閉,file_get_contents處理方法,可以參考這篇文章,http://www.cnblogs.com/scofi/articles/3607529.html
公司裡有經常有這樣的業務,需要呼叫第三方公司提供的HTTP介面,在把介面提供的資訊顯示到網頁上,程式碼是這樣寫的: file_get_contents("http://example.com/") 。
1
2
3
4
5
6
7
8
9
|
$opts = array ( 'http' => array ( 'method' => "GET" , 'timeout' =>10,
) ); $context =
stream_context_create( $opts ); $html = file_get_contents ( 'http://www.example.com' ,
false, $context ); echo $html ; |
程式碼中的timeout就是file_get_contents讀取url的超時時間。
上篇說到我們說到設定file_get_contents超時時間用到了 stream_context_create方法,那麼這個方法到底是什麼呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php $data = array ( "name" => 'test_name' , "content" => 'test_con' ); $data =
http_build_query( $data ); $opts = array ( 'http' => array ( 'method' => "POST" , 'header' => "Content-type:
application/x-www-form-urlencoded\r\n" . "Content-length:" . strlen ( $data ). "\r\n" . "Cookie:
foo=bar\r\n" . "\r\n" , 'content' => $data , ) ); $cxContext =
stream_context_create( $opts ); $sFile = file_get_contents ( "http://127.0.0.1/reponse.php" ,
false, $cxContext ); echo $sFile ; ?> |
reponse.php被請求的頁面:
1
2
3
4
|
<?php var_dump( $_POST ); var_dump( $_COOKIE ); ?> |
執行之後的結果為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php $url = 'http://www.example.com' ; //初始化一個
cURL 物件 $ch =
curl_init(); //設定你需要抓取的URL curl_setopt( $ch ,
CURLOPT_URL, $url ); //
設定cURL 引數,要求結果儲存到字串中還是輸出到螢幕上。 curl_setopt( $ch ,
CURLOPT_RETURNTRANSFER, 1); //是否獲得跳轉後的頁面 curl_setopt( $ch ,
CURLOPT_FOLLOWLOCATION, 1); $data =
curl_exec( $ch ); curl_close( $ch ); echo $data ; ?> |
(2)使用curl。post獲取資料
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php function curl_post( $url , $arr_data ){ $post_data =
http_build_query( $url_data ); $ch =
curl_init(); curl_setopt( $ch ,
CURLOPT_URL, $url ); curl_setopt( $ch ,
CURLOPT_RETURNTRANSFER, 1); curl_setopt( $ch ,
CURLOPT_POST, 1); curl_setopt( $ch ,
CURLOPT_POSTFLELDS, $post_data ); $data =
curl_exec( $ch ); curl_close( $ch ); echo $data ; } $arr_post = array ( 'name' => 'test_name' , 'age' =>
1 ); curl_post( "http://www.explame.com/" , $arr_post ); ?> |
(3)使用代理抓取頁面,什麼要使用代理進行抓取呢?以google為例吧,如果去抓google的資料,短時間內抓的很頻繁的話,你就抓取不到了。google對你的ip地址做限制這個時候,你可以換代理重新抓。
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php $ch =
curl_init(); curl_setopt( $ch ,
CURLOPT_URL, "http://google.com" ); curl_setopt( $ch ,
CURLOPT_HEADER, false); curl_setopt( $ch ,
CURLOPT_RETURNTRANSFER, 1); //是否通過http代理來傳輸 curl_setopt( $ch ,
CURLOPT_HTTPPROXYTUNNEL, TRUE); curl_setopt( $ch ,
CURLOPT_PROXY, 125.21.23.6:8080); //url_setopt($ch,
CURLOPT_PROXYUSERPWD, 'user:password');如果要密碼的話,加上這個 $result =curl_exec( $ch ); curl_close( $ch ); ?> |
(4)繼續保持本站session呼叫,在實現使用者同步登入的情況下需要共享session,如果要繼續保持本站的session,那麼要把sessionid放到http請求中。
1
2
3
4
5
6
7
8
9
10
11
|
<?php $session_str =
session_name(). '=' .session_id(). ';
path=/; domain=.explame.com' ; session_write_close(); //將資料寫入檔案並且結束session $ch =
curl_init(); curl_setopt( $ch ,
CURLOPT_URL, $url ); curl_setopt( $ch ,
CURLOPT_HEADER, false); curl_setopt( $ch ,
CURLOPT_RETURNTRANSFER, 1); curl_setopt( $ch ,
CURLOPT_COOKIE, $session_str ); $ret =
curl_exec( $ch ); curl_close( $ch ); ?> |
相關文章
- php下請求url的幾種方式PHP
- php獲取遠端檔案內容的函式PHP函式
- Php通過curl提交post內容為Json的請求PHPJSON
- AngularJS轉換請求內容AngularJS
- php請求API介面方法PHPAPI
- PHP下載遠端檔案及獲取檔案內容PHP
- 如何在 PHP 中傳送 xml 資料作為請求內容PHPXML
- URL請求不能解決中文請求的問題
- requests請求返回內容 中文亂碼問題
- python全棧02-----url_for,HTTP的請求方法Python全棧HTTP
- iOS請求URL 中文轉譯iOS
- FastAPI中請求URL傳參ASTAPI
- PHP curl 請求PHP
- 利用post請求傳送內容進行爬蟲爬蟲
- 對於動態載入內容 (包括 Ajax 請求內容) 繫結點選事件事件
- PHP獲取HTTP body內容的方法PHPHTTP
- 請求轉發與URL重定向
- get,post URL加字尾請求
- 【轉】怎麼用PHP傳送HTTP請求(POST請求、GET請求)?PHPHTTP
- spring mvc中獲取請求URLSpringMVC
- 『言善信』Fiddler工具 — 2、HTTP請求內容詳解HTTP
- java 獲取URL連結 內容Java
- java 資料探勘 URL 內容流Java
- 如何修改 Git 遠端倉庫 URLGit
- HTTP請求方法HTTP
- PHP curl 請求使用教程PHP
- php獲取網頁內容的三種方法PHP網頁
- 遠端兼職 PHPPHP
- laravel是不是也可以強轉請求內容的型別啊Laravel型別
- 利用 Amazon API Gateway 和 Amazon Lambda 處理 Cloudfront 的內容請求APIGatewayCloud
- 如何在Spring Boot中驗證JSON請求內容? - SeunSpring BootJSON
- 補: Rest 風格請求處理的的內容補充(1)REST
- php模擬請求(偽造來源和請求ip)PHP
- Almofire 拼接get請求url包含中文報錯
- phpcms—— 內容中的附件呼叫和新增遠端地址的呼叫PHP
- asp.net用三種方法檢測遠端URL存在與否ASP.NET
- asp.net下檢測遠端URL是否存在的三種方法ASP.NET
- vnc遠端用外網遠端公司內網,3步實現vnc遠端用外網遠端公司內網VNC內網