當同一網域對應多個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 = ''; $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", "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中文網其他相關文章!