首頁  >  文章  >  後端開發  >  php如何使用相同網域對多個ip抓取遠端網頁內容?

php如何使用相同網域對多個ip抓取遠端網頁內容?

伊谢尔伦
伊谢尔伦原創
2017-07-17 10:30:191418瀏覽

當同一網域對應多個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的檔案沒什麼明顯的差別。內容長,就可以花更長的時間去讀,而不是讓腳本死掉。

PHP取得遠端網頁內容有多種方式,例如用自帶的file_get_contents、fopen等函數。

<?php 
echo file_get_contents("http://php.cn/abc.php");
?>

但是,在DNS輪詢等負載平衡中,同一域名,可能對應多台伺服器,多個IP。假設http://php.cn/abc.php
被DNS解析到72.249.146.213、72.249.146.214、72.249.146.215三個IP,使用者每次造訪http://php.cn/abc.php,系統會根據負載平衡的相應演算法存取其中的一台伺服器。
上週做一個視訊專案時,就碰到這樣一類需求:需要依序存取每台伺服器上的一個PHP介面程式(假設為abc.php),查詢這台伺服器的傳輸狀態
這時就不能直接用file_get_contents來存取http://php.cn/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頭中加上php.cn網域。於是,寫了下面這個PHP函數

<?php
 /************************
 * 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容
 * 参数说明:
 * $ip服务器的IP地址
 * $host服务器的host名称
 * $url服务器的URL地址(不含域名)
 * 返回值:
 * 获取到的远程网页内容
 * false访问远程网页失败
 ************************/
function HttpVisit($ip, $host, $url) 
{ 
$errstr = &#39;&#39;; 
$errno = &#39;&#39;; 
$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", "php.cn", "/abc.php"); 
 $server_info2 = HttpVisit("72.249.146.214", "php.cn", "/abc.php"); 
 $server_info3 = HttpVisit("72.249.146.215", "php.cn", "/abc.php"); 
 ?>

用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();
?>

以上是php如何使用相同網域對多個ip抓取遠端網頁內容?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn