php 調用遠程url的六種方法小結

php 調用遠程url的六種方法小結

發佈:dxy 字體:[ 增長  減少] 類型:轉載
php 調用遠程url的六種方法,須要的朋友能夠參考下。
示例代碼1: 用file_get_contents 以get方式獲取內容 
複製代碼代碼以下:

<?php 
$url='http://www.baidu.com/'; 
$html=file_get_contents($url); 
//print_r($http_response_header); 
ec($html); 
printhr(); 
printarr($http_response_header); 
printhr(); 
?> 


示例代碼2: 用fopen打開url, 以get方式獲取內容 
複製代碼代碼以下:

<? 
$fp=fopen($url,'r'); 
printarr(stream_get_meta_data($fp)); 
printhr(); 
while(!feof($fp)){ 
$result.=fgets($fp,1024); 

echo"url body: $result"; 
printhr(); 
fclose($fp); 
?> 

示例代碼3:用file_get_contents函數,以post方式獲取url 
複製代碼代碼以下:

<?php 
$data=array('foo'=>'bar'); 
$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", 
'content'=>$data 
), 
); 
$context=stream_context_create($opts); 
$html=file_get_contents('http://localhost/e/admin/test.html',false,$context); 
echo$html; 
?> 

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

<? 
functionget_url($url,$cookie=false){ 
$url=parse_url($url); 
$query=$url[path]."?".$url[query]; 
ec("Query:".$query); 
$fp=fsockopen($url[host],$url[port]?$url[port]:80,$errno,$errstr,30); 
if(!$fp){ 
returnfalse; 
}else{ 
$request="GET$queryHTTP/1.1\r\n"; 
$request.="Host:$url[host]\r\n"; 
$request.="Connection: Close\r\n"; 
if($cookie)$request.="Cookie: $cookie\n"; 
$request.="\r\n"; 
fwrite($fp,$request); 
while(!@feof($fp)){ 
$result.=@fgets($fp,1024); 

fclose($fp); 
return$result; 


//獲取url的html部分,去掉header 
functionGetUrlHTML($url,$cookie=false){ 
$rowdata=get_url($url,$cookie); 
if($rowdata) 

$body=stristr($rowdata,"\r\n\r\n"); 
$body=substr($body,4,strlen($body)); 
return$body; 

returnfalse; 

?> 

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

<? 
functionHTTP_Post($URL,$data,$cookie,$referrer=""){ 
// parsing the given URL 
$URL_Info=parse_url($URL); 

// Building referrer 
if($referrer=="")// if not given use this script. as referrer 
$referrer="111"; 

// making string from $data 
foreach($dataas$key=>$value) 
$values[]="$key=".urlencode($value); 
$data_string=implode("&",$values); 

// Find out which port is needed - if not given use standard (=80) 
if(!isset($URL_Info["port"])) 
$URL_Info["port"]=80; 

// building POST-request: 
$request.="POST ".$URL_Info["path"]." HTTP/1.1\n"; 
$request.="Host: ".$URL_Info["host"]."\n"; 
$request.="Referer:$referer\n"; 
$request.="Content-type: application/x-www-form-urlencoded\n"; 
$request.="Content-length: ".strlen($data_string)."\n"; 
$request.="Connection: close\n"; 
$request.="Cookie: $cookie\n"; 
$request.="\n"; 
$request.=$data_string."\n"; 

$fp=fsockopen($URL_Info["host"],$URL_Info["port"]); 
fputs($fp,$request); 
while(!feof($fp)){ 
$result.=fgets($fp,1024); 

fclose($fp); 
return$result; 

printhr(); 
?> 

示例代碼6:使用curl庫,使用curl庫以前,你可能須要查看一下php.ini,查看是否已經打開了curl擴展 
複製代碼代碼以下:

<? 
$ch = curl_init(); 
$timeout = 5; 
curl_setopt ($ch, CURLOPT_URL, 'http://www.baidu.com/'); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
$file_contents = curl_exec($ch); 
curl_close($ch); 
echo $file_contents; 
?> 

關於curl庫: 
curl官方網站http://curl.haxx.se/ 
curl 是使用URL語法的傳送文件工具,支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL證書、HTTP POST、HTTP PUT 、FTP 上傳,kerberos、基於HTT格式的上傳、代理、cookie、用戶+口令證實、文件傳送恢復、http代理通道和大量其餘有用的技巧 
複製代碼代碼以下:

<? 
functionprintarr(array$arr) 

echo"<br> Row field count: ".count($arr)."<br>"; 
foreach($arras$key=>$value) 

echo"$key=$value <br>"; 


?> 

====================================================== 
PHP抓取遠程網站數據的代碼 
如今可能還有不少程序愛好者都會遇到一樣的疑問,就是要如何像搜索引擎那樣去抓取別人網站的HTML代碼,而後把代碼收集整理成爲本身有用的數據!今天就等我介紹一些簡單例子吧. 

Ⅰ.抓取遠程網頁標題的例子: 
如下是代碼片斷: 
複製代碼代碼以下:

<?php 
/* 
+------------------------------------------------------------- 
+抓取網頁標題的代碼,直接拷貝本代碼片斷,另存爲.php文件執行便可. 
+------------------------------------------------------------- 
*/ 

error_reporting(7); 
$file = fopen ("http://www.jb51.net/", "r"); 
if (!$file) { 
echo "<font color=red>Unable to open remote file.</font>\n"; 
exit; 

while (!feof ($file)) { 
$line = fgets ($file, 1024); 
if (eregi ("<title>(.*)</title>", $line, $out)) { 
$title = $out[1]; 
echo "".$title.""; 
break; 


fclose($file); 

//End 
?> 

Ⅱ.抓取遠程網頁HTML代碼的例子: 

如下是代碼片斷: 
複製代碼代碼以下:

<? php 
/* 
+---------------- 
+DNSing Sprider 
+---------------- 
*/ 

$fp = fsockopen("www.dnsing.com", 80, $errno, $errstr, 30); 
if (!$fp) { 
echo "$errstr ($errno)<br/>\n"; 
} else { 
$out = "GET / HTTP/1.1\r\n"; 
$out .= "Host:www.dnsing.com\r\n"; 
$out .= "Connection: Close \r\n\r\n"; 
fputs($fp, $out); 
while (!feof($fp)) { 
echo fgets($fp, 128); 

fclose($fp); 

//End 
?> 
以上兩個代碼片斷都直接Copy回去運行就知道效果了,上面的例子只是抓取網頁數據的雛形,要使其更適合本身的使用,狀況有各異.因此,在此各位程序愛好者本身好好研究一下吧. 

=============================== 

稍微有點意義的函數是:get_content_by_socket(), get_url(), get_content_url(), get_content_object 幾個函數,也許可以給你點什麼想法。 
<?php 

//獲取全部內容url保存到文件 
function get_index($save_file, $prefix="index_"){ 
$count = 68; 
$i = 1; 
if (file_exists($save_file)) @unlink($save_file); 
$fp = fopen($save_file, "a+") or die("Open ". $save_file ." failed"); 
while($i<$count){ 
$url = $prefix . $i .".htm"; 
echo "Get ". $url ."..."; 
$url_str = get_content_url(get_url($url)); 
echo " OK\n"; 
fwrite($fp, $url_str); 
++$i; 

fclose($fp); 


//獲取目標多媒體對象 
function get_object($url_file, $save_file, $split="|--:**:--|"){ 
if (!file_exists($url_file)) die($url_file ." not exist"); 
$file_arr = file($url_file); 
if (!is_array($file_arr) || empty($file_arr)) die($url_file ." not content"); 
$url_arr = array_unique($file_arr); 
if (file_exists($save_file)) @unlink($save_file); 
$fp = fopen($save_file, "a+") or die("Open save file ". $save_file ." failed"); 
foreach($url_arr as $url){ 
if (empty($url)) continue; 
echo "Get ". $url ."..."; 
$html_str = get_url($url); 
echo $html_str; 
echo $url; 
exit; 
$obj_str = get_content_object($html_str); 
echo " OK\n"; 
fwrite($fp, $obj_str); 

fclose($fp); 


//遍歷目錄獲取文件內容 
function get_dir($save_file, $dir){ 
$dp = opendir($dir); 
if (file_exists($save_file)) @unlink($save_file); 
$fp = fopen($save_file, "a+") or die("Open save file ". $save_file ." failed"); 
while(($file = readdir($dp)) != false){ 
if ($file!="." && $file!=".."){ 
echo "Read file ". $file ."..."; 
$file_content = file_get_contents($dir . $file); 
$obj_str = get_content_object($file_content); 
echo " OK\n"; 
fwrite($fp, $obj_str); 


fclose($fp); 



//獲取指定url內容 
function get_url($url){ 
$reg = '/^http:\/\/[^\/].+$/'; 
if (!preg_match($reg, $url)) die($url ." invalid"); 
$fp = fopen($url, "r") or die("Open url: ". $url ." failed."); 
while($fc = fread($fp, 8192)){ 
$content .= $fc; 

fclose($fp); 
if (empty($content)){ 
die("Get url: ". $url ." content failed."); 

return $content; 


//使用socket獲取指定網頁 
function get_content_by_socket($url, $host){ 
$fp = fsockopen($host, 80) or die("Open ". $url ." failed"); 
$header = "GET /".$url ." HTTP/1.1\r\n"; 
$header .= "Accept: */*\r\n"; 
$header .= "Accept-Language: zh-cn\r\n"; 
$header .= "Accept-Encoding: gzip, deflate\r\n"; 
$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)\r\n"; 
$header .= "Host: ". $host ."\r\n"; 
$header .= "Connection: Keep-Alive\r\n"; 
//$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n"; 
$header .= "Connection: Close\r\n\r\n"; 

fwrite($fp, $header); 
while (!feof($fp)) { 
$contents .= fgets($fp, 8192); 

fclose($fp); 
return $contents; 



//獲取指定內容裏的url 
function get_content_url($host_url, $file_contents){ 

//$reg = '/^(#|javascript.*?|ftp:\/\/.+|http:\/\/.+|.*?href.*?|play.*?|index.*?|.*?asp)+$/i'; 
//$reg = '/^(down.*?\.html|\d+_\d+\.htm.*?)$/i'; 
$rex = "/([hH][rR][eE][Ff])\s*=\s*['\"]*([^>'\"\s]+)[\"'>]*\s*/i"; 
$reg = '/^(down.*?\.html)$/i'; 
preg_match_all ($rex, $file_contents, $r); 
$result = ""; //array(); 
foreach($r as $c){ 
if (is_array($c)){ 
foreach($c as $d){ 
if (preg_match($reg, $d)){ $result .= $host_url . $d."\n"; } 



return $result; 


//獲取指定內容中的多媒體文件 
function get_content_object($str, $split="|--:**:--|"){ 
$regx = "/href\s*=\s*['\"]*([^>'\"\s]+)[\"'>]*\s*(<b>.*?<\/b>)/i"; 
preg_match_all($regx, $str, $result); 

if (count($result) == 3){ 
$result[2] = str_replace("<b>多媒體: ", "", $result[2]); 
$result[2] = str_replace("</b>", "", $result[2]); 
$result = $result[1][0] . $split .$result[2][0] . "\n"; 

return $result; 


?> 

====================================================== 

同一域名對應多個IP時,PHP獲取遠程網頁內容的函數 

fgc就是簡單的讀取過來,把一切操做封裝了 
fopen也進行了一些封裝,可是須要你循環讀取獲得全部數據。 
fsockopen這是直闆闆的socket操做。 
若是僅僅是讀取一個html頁面,fgc更好。 
若是公司是經過防火牆上網,一 般的file_get_content函數就不行了。固然,經過一些socket操做,直接向proxy寫http請求也是能夠的,可是比較麻煩。 
若是你能確認文件很小,能夠任選以上兩種方式fopen ,join('',file($file));。好比,你只操做小於1k的文件,那最好仍是用file_get_contents吧。 

若是肯定文件很大,或者不能肯定文件的大小,那就最好使用文件流了。fopen一個1K的文件和fopen一個1G的文件沒什麼明顯的區別。內容長,就能夠花更長的時間去讀,而不是讓腳本死掉。 

---------------------------------------------------- 
http://www.phpcake.cn/archives/tag/fsockopen 
PHP獲取遠程網頁內容有多種方式,例如用自帶的file_get_contents、fopen等函數。 

<?php 

echo file_get_contents("http://img.jb51.net/abc.php"); 
?> 
 可是,在DNS輪詢等負載均衡中,同一域名,可能對應多臺服務器,多個IP。假設img.jb51.net被DNS解析到 72.249.146.21三、72.249.146.21四、72.249.146.215三個IP,用戶每次訪問img.jb51.net,系統會根據負載均衡的相應算法訪問其中的一臺服務器。 
  上週作一個視頻項目時,就碰到這樣一類需求:須要依次訪問每臺服務器上的一個PHP接口程序(假設爲abc.php),查詢這臺服務器的傳輸狀態。 

  這時就不能直接用file_get_contents訪問http://img.jb51.net/abc.php了,由於它可能一直重複訪問某一臺服務器。 

  而採用依次訪問http://72.249.146.213/abc.php、http://72.249.146.214/abc.php、http://72.249.146.215/abc.php的方法,在這三臺服務器上的Web Server配有多個虛擬主機時,也是不行的。 

  經過設置本地hosts也不行,由於hosts不能設置多個IP對應同一個域名。 

  那就只有經過PHP和HTTP協議來實現:訪問abc.php時,在header頭中加上img.jb51.net域名。因而,我寫了下面這個PHP函數: 
複製代碼代碼以下:

<?php 

/************************ 
* 函數用途:同一域名對應多個IP時,獲取指定服務器的遠程網頁內容 
* 建立時間:2008-12-09 
* 建立人:張宴(img.jb51.net) 
* 參數說明: 
* $ip 服務器的IP地址 
* $host 服務器的host名稱 
* $url 服務器的URL地址(不含域名) 
* 返回值: 
* 獲取到的遠程網頁內容 
* false 訪問遠程網頁失敗 
************************/ 
function HttpVisit($ip, $host, $url) 

$errstr = ''; 
$errno = ''; 
$fp = fsockopen ($ip, 80, $errno, $errstr, 90); 
if (!$fp) 

return false; 

else 

$out = "GET {$url} HTTP/1.1\r\n"; 
$out .= "Host:{$host}\r\n"; 
$out .= "Connection: close\r\n\r\n"; 
fputs ($fp, $out); 

while($line = fread($fp, 4096)){ 
$response .= $line; 

fclose( $fp ); 

//去掉Header頭信息 
$pos = strpos($response, "\r\n\r\n"); 
$response = substr($response, $pos + 4); 

return $response; 



//調用方法: 
$server_info1 = HttpVisit("72.249.146.213", "img.jb51.net", "/abc.php"); 
$server_info2 = HttpVisit("72.249.146.214", "img.jb51.net", "/abc.php"); 
$server_info3 = HttpVisit("72.249.146.215", "img.jb51.net", "/abc.php"); 
?> 
相關文章
相關標籤/搜索