亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php中curl、fsocket、file_get_content三個函數的使用比較

2024-09-04 11:43:18
字體:
來源:轉載
供稿:網友

最近做一個網頁小偷程序的時候才發現file_get_content已經完全不能滿足需求了。我覺得,在讀取遠程內容的時候,file_get_content除了使用比curl便捷以外,其他都沒有curl好。

抓取遠程內容,之前一直都在用file_get_content函數,其實早就知道有curl這么一個好東西的存在,但是看了一眼后感覺使用頗有些復雜,沒有file_get_content那么簡單,再就是需求也不大,所以沒有學習使用curl。

直到最近,要做一個網頁小偷程序的時候才發現file_get_content已經完全不能滿足需求了。我覺得,在讀取遠程內容的時候,file_get_content除了使用比curl便捷以外,其他都沒有curl好。

php中curl和file_get_content的一些比較

主要區別:

學習才發現,curl支持很多協議,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP,也就是說,它能做到很多file_get_content做不到的事情。curl在php可以實現遠程獲取和采集內容;實現PHP網頁版的FTP上傳下載;實現模擬登陸;實現接口對接(API),數據傳輸;實現模擬Cookie;下載文件斷點續傳等等,功能十分強大。

了解curl一些基本的使用后,才發現其實并不難,只不過記住里面一些設置參數,難弄一點,但是我們記住幾個常用的就可以了。

開啟curl:

因為PHP默認是不支持curl功能的,因此如果要用curl的話,首先需要在php.ini中開啟該功能,即去掉 ;extension= php_curl.dll 前面的分號,然后保存后重啟apache/iis就好了。

基本語法:

  1. $my_curl = curl_init();    //初始化一個curl對象 
  2. curl_setopt($my_curl, CURLOPT_URL, "http://www.49028c.com");    //設置你需要抓取的URL 
  3. curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1);    //設置是將結果保存到字符串中還是輸出到屏幕上,1表示將結果保存到字符串 
  4. $str = curl_exec($curl);    //執行請求 
  5. echo $str;    //輸出抓取的結果 
  6. curl_close($curl);    //關閉url請求 

最近需要獲取別人網站上的音樂數據。用了file_get_contents函數,但是總是會遇到獲取失敗的問題,盡管按照手冊中的例子設置了超時,可多數時候不會奏效:

  1. $config['context'] = stream_context_create(array('http' => array('method' => "GET"
  2. 'timeout' => 5//這個超時時間不穩定,經常不奏效 
  3. )); 

這時候,看一下服務器的連接池,會發現一堆類似的錯誤,讓我頭疼萬分:

file_get_contents(http://***): failed to open stream…

現在改用了curl庫,寫了一個函數替換:

  1. function curl_file_get_contents($durl){ 
  2. $ch = curl_init(); 
  3. curl_setopt($ch, CURLOPT_URL, $durl); 
  4. curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
  5. curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_); 
  6. curl_setopt($ch, CURLOPT_REFERER,_REFERER_); 
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  8. $r = curl_exec($ch); 
  9. curl_close($ch); 
  10. return $r

如此,除了真正的網絡問題外,沒再出現任何問題。

這是別人做過的關于curl和file_get_contents的測試:

file_get_contents抓取google.com需用秒數:

  1. 2.31319094 
  2. 2.30374217 
  3. 2.21512604 
  4. 3.30553889 
  5. 2.30124092 

curl使用的時間:

  1. 0.68719101 
  2. 0.64675593 
  3. 0.64326 
  4. 0.81983113 
  5. 0.63956594 

差距很大?呵呵,從我使用的經驗來說,這兩個工具不只是速度有差異,穩定性也相差很大。

建議對網絡數據抓取穩定性要求比較高的朋友使用上面的 curl_file_get_contents函數,不但穩定速度快,還能假冒瀏覽器欺騙目標地址哦!

方法1: 用file_get_contents 以get方式獲取內容,代碼如下:

  1. <?php 
  2. $url='http://www.domain.com/'
  3. $html = file_get_contents($url); 
  4. echo $html
  5. ?> 

方法2: 用fopen打開url, 以get方式獲取內容,代碼如下:

  1. <?php 
  2. $fp = fopen($url'r'); 
  3. stream_get_meta_data($fp); 
  4. while(!feof($fp)) { 
  5. $result .= fgets($fp, 1024); 
  6. echo "url body: $result"
  7. fclose($fp); 
  8. ?> 

方法3:用file_get_contents函數,以post方式獲取url,代碼如下:

  1. <?php 
  2. $data = array ('foo' => 'bar'); 
  3. $data = http_build_query($data); 
  4. $opts = array ( 
  5. 'http' => array ( 
  6. 'method' => 'POST'
  7. 'header'=> "Content-type: application/x-www-form-urlencodedrn" . 
  8. "Content-Length: " . strlen($data) . "rn"
  9. 'content' => $data 
  10. ); 
  11. $context = stream_context_create($opts); 
  12. $html = file_get_contents('http://localhost/e/admin/test.html', false, $context); 
  13. echo $html
  14. ?> 

方法4:用fsockopen函數打開url,以get方式獲取完整的數據,包括header和body,代碼如下:

  1. <?php 
  2. function get_url ($url,$cookie=false) 
  3. $url = parse_url($url); 
  4. $query = $url[path]."?".$url[query]; 
  5. echo "Query:".$query
  6. $fp = fsockopen$url[host], $url[port]?$url[port]:80 , $errno$errstr, 30); 
  7. if (!$fp) { 
  8. return false; 
  9. else { 
  10. $request = "GET $query HTTP/1.1rn"
  11. $request .= "Host: $url[host]rn"
  12. $request .= "Connection: Closern"
  13. if($cookie$request.="Cookie: $cookien"
  14. $request.="rn"
  15. fwrite($fp,$request); 
  16. while()) { 
  17. $result .= @fgets($fp, 1024); 
  18. fclose($fp); 
  19. return $result
  20. //獲取url的html部分,去掉header 
  21. function GetUrlHTML($url,$cookie=false) 
  22. $rowdata = get_url($url,$cookie); 
  23. if($rowdata
  24. $bodystristr($rowdata,"rnrn"); 
  25. $body=substr($body,4,strlen($body)); 
  26. return $body
  27. return false; 
  28. ?> 

方法5:用fsockopen函數打開url,以POST方式獲取完整的數據,包括header和body,代碼如下:

  1. <?php 
  2. function HTTP_Post($URL,$data,$cookie$referrer=""
  3. // parsing the given URL 
  4. $URL_Info=parse_url($URL); 
  5. // Building referrer 
  6. if($referrer==""// if not given use this script as referrer 
  7. $referrer="111″; 
  8.  
  9. // making string from $data 
  10. foreach($data as $key=>$value
  11. $values[]="$key=".urlencode($value); 
  12. $data_string=implode("&",$values); 
  13.  
  14. // Find out which port is needed – if not given use standard (=80) 
  15. if(!isset($URL_Info["port"])) 
  16. $URL_Info["port"]=80; 
  17.  
  18. // building POST-request: 
  19. $request.="POST ".$URL_Info["path"]." HTTP/1.1n"
  20. $request.="Host: ".$URL_Info["host"]."n"
  21. $request.="Referer: $referern"
  22. $request.="Content-type: application/x-www-form-urlencodedn"
  23. $request.="Content-length: ".strlen($data_string)."n"
  24. $request.="Connection: closen"
  25.  
  26. $request.="Cookie: $cookien"
  27.  
  28. $request.="n"
  29. $request.=$data_string."n"
  30.  
  31. $fp = fsockopen($URL_Info["host"],$URL_Info["port"]); 
  32. fputs($fp$request); 
  33. while(!feof($fp)) { 
  34. $result .= fgets($fp, 1024); 
  35. fclose($fp); 
  36.  
  37. return $result
  38. ?> 

方法6:使用curl庫,使用curl庫之前,可能需要查看一下php.ini是否已經打開了curl擴展,代碼如下:

  1. <?php 
  2. $ch = curl_init(); 
  3. $timeout = 5; 
  4. curl_setopt ($ch, CURLOPT_URL, 'http://www.domain.com/'); 
  5. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
  6. curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
  7. $file_contents = curl_exec($ch); 
  8. curl_close($ch); 
  9. echo $file_contents
  10. ?> 

php中 curl, fsockopen ,file_get_contents 三個函數 都可以實現采集模擬發言 。三者有什么區別,或者講究么。

趙永斌:

有些時候用file_get_contents()調用外部文件,容易超時報錯。換成curl后就可以.具體原因不清楚

curl 效率比file_get_contents()和fsockopen()高一些,原因是CURL會自動對DNS信息進行緩存(亮點啊有我待親測)

范佳鵬:

file_get_contents curl fsockopen

在當前所請求環境下選擇性操作,沒有一概而論:

具我們公司開發KBI應用來看:

剛開始采用:file_get_contents

后來采用:fsockopen

最后到至今采用:curl

(遠程)我個人理解到的表述如下(不對請指出,不到位請補充)

file_get_contents 需要php.ini里開啟allow_url_fopen,請求http時,使用的是http_fopen_wrapper,不會keeplive.curl是可以的。

file_get_contents()單個執行效率高,返回沒有頭的信息。

這個是讀取一般文件的時候并沒有什么問題,但是在讀取遠程問題的時候就會出現問題。

如果是要打一個持續連接,多次請求多個頁面。那么file_get_contents和fopen就會出問題。

取得的內容也可能會不對。所以做一些類似采集工作的時候,肯定就有問題了。

sock較底層,配置麻煩,不易操作。 返回完整信息。

潘少寧-騰訊:

file_get_contents 雖然可以獲得某URL的內容,但不能post get啊。

curl 則可以post和get啊。還可以獲得head信息

而socket則更底層??梢栽O置基于UDP或是TCP協議去交互

file_get_contents 和 curl 能干的,socket都能干。

socket能干的,curl 就不一定能干了

file_get_contents 更多的時候 只是去拉取數據。效率比較高 也比較簡單。

趙的情況這個我也遇到過,我通過CURL設置host 就OK了。 這和網絡環境有關系。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美在线一区| 97视频人免费观看| 欧美一区二区影院| 97免费在线视频| 狠狠做深爱婷婷久久综合一区| 日韩精品极品在线观看播放免费视频| 欧洲成人在线观看| 久久99精品视频一区97| 亚洲成人久久久| 啊v视频在线一区二区三区| 国产一区红桃视频| 97色在线视频| 亚洲欧美国产精品va在线观看| 欧美日韩国产va另类| 久久精品91久久久久久再现| 日韩在线视频观看| 中文字幕亚洲欧美日韩在线不卡| 亚洲乱码一区av黑人高潮| 久久精品亚洲94久久精品| 亚洲激情视频网站| 日韩中文在线中文网三级| 亚洲电影av在线| 久久成年人免费电影| 91精品国产91久久久久久不卡| 国产亚洲人成网站在线观看| 不卡av电影院| 欧美大肥婆大肥bbbbb| 日韩av高清不卡| 亚洲综合一区二区不卡| 久久综合色影院| 日韩精品视频在线观看网址| 国产精品va在线播放我和闺蜜| 国产福利成人在线| 亚洲色图欧美制服丝袜另类第一页| 亚洲免费人成在线视频观看| 久久艹在线视频| 日韩成人久久久| 97热在线精品视频在线观看| 国产香蕉精品视频一区二区三区| 亚洲精品福利视频| 欧美成人在线免费视频| 久久视频国产精品免费视频在线| 日韩高清电影好看的电视剧电影| 精品亚洲一区二区三区在线观看| 欧美香蕉大胸在线视频观看| 狠狠操狠狠色综合网| 欧美午夜视频在线观看| 91在线免费网站| 日韩精品极品视频免费观看| 午夜精品福利电影| 在线亚洲国产精品网| 成人444kkkk在线观看| 亚洲欧美日韩在线一区| 日韩在线观看成人| 国产激情综合五月久久| 国产999精品久久久| 狠狠躁夜夜躁人人爽超碰91| 国产精品主播视频| 国产精品一区二区久久精品| 久热精品视频在线观看| 欧美华人在线视频| 最近2019年中文视频免费在线观看| 亚洲女人被黑人巨大进入al| 国产精品自产拍高潮在线观看| 亚洲精品国产精品国自产观看浪潮| 人九九综合九九宗合| 6080yy精品一区二区三区| 国产精品日韩av| 青青草99啪国产免费| 久久99视频免费| 亚洲精品免费av| 色综合久久天天综线观看| 91久久久久久国产精品| 色偷偷噜噜噜亚洲男人| www.日韩免费| 国产精品日韩一区| 欧美成人黄色小视频| 亚洲毛片在线观看.| www.久久色.com| 国产97色在线| 精品毛片网大全| 国产97人人超碰caoprom| 亚洲欧美精品一区| 91免费电影网站| 久久久国产精品视频| 午夜剧场成人观在线视频免费观看| 久久亚洲精品一区| 日韩精品极品在线观看播放免费视频| 九九热这里只有在线精品视| 国产精品wwww| 国产成人亚洲综合91| 中文字幕一区二区精品| 日韩欧美在线视频日韩欧美在线视频| 午夜欧美大片免费观看| 免费不卡在线观看av| 日韩第一页在线| 日韩va亚洲va欧洲va国产| 91福利视频网| 国产视频丨精品|在线观看| 日韩欧美国产高清91| 97国产在线视频| 国内偷自视频区视频综合| 欧美激情一级精品国产| 欧美日韩免费一区| 欧美交受高潮1| 少妇高潮久久久久久潘金莲| 精品久久久久久久久国产字幕| 日韩免费av在线| 亚洲精品在线91| 国产亚洲激情在线| 国产精品一区二区电影| 91九色视频导航| 国产成人精品av| 色婷婷综合久久久久中文字幕1| 国产美女精品视频| 欧美日韩国产色视频| 7777精品视频| 久久精品久久久久久| 欧美日韩亚洲91| 亚洲一区二区中文| 欧美日韩亚洲国产一区| 亚洲毛片在线观看.| 亚洲小视频在线| 久久久免费观看视频| 国产97在线亚洲| 日韩在线视频中文字幕| 精品福利视频导航| 久久久久久久国产| 久久精品国产v日韩v亚洲| 亚洲精品在线视频| 国产成人高清激情视频在线观看| 亚洲最新视频在线| 日韩在线播放视频| 4438全国亚洲精品在线观看视频| 日韩有码在线视频| 日本精品久久中文字幕佐佐木| 欧美日韩午夜剧场| 欧洲精品在线视频| 国产精品日韩在线观看| 亚洲成人性视频| 人人澡人人澡人人看欧美| 欧美日韩午夜激情| 国产精品自拍小视频| 亚洲精品二三区| 欧美性精品220| 国产成人在线视频| 亚洲激情小视频| 国产成人一区二| 色妞久久福利网| 欧美精品videosex极品1| 色婷婷成人综合| 国产在线拍揄自揄视频不卡99| 久久久久久91香蕉国产| 亚洲第一免费网站| 黑人极品videos精品欧美裸| 午夜精品久久久久久久99热| 亚洲理论电影网| 日韩精品中文字幕视频在线| 亚洲香蕉成人av网站在线观看| 91久久精品国产| 色婷婷av一区二区三区在线观看| 久久亚洲国产精品成人av秋霞| 久久久久99精品久久久久| 欧美日韩高清在线观看|