PHP獲取遠程網頁內容有多種方式,例如用自帶的file_get_contents、fopen等函數。php
<?php
echo file_get_contents("http://blog.s135.com/abc.php");
?>算法
可是,在DNS輪詢等負載均衡中,同一域名,可能對應多臺服務器,多個IP。假設blog.s135.com被DNS解析到 72.249.146.21三、72.249.146.21四、72.249.146.215三個IP,用戶每次訪問blog.s135.com,系統會 根據負載均衡的相應算法訪問其中的一臺服務器。
上週作一個視頻項目時,就碰到這樣一類需求:須要依次訪問每臺服務器上的一個PHP接口程序(假設爲abc.php),查詢這臺服務器的傳輸狀態。
這時就不能直接用file_get_contents訪問http://blog.s135.com/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頭中加上blog.s135.com域名。因而,我寫了下面這個PHP函數:服務器
<?php 函數
/************************ url
* 函數用途:同一域名對應多個IP時,獲取指定服務器的遠程網頁內容 spa
* 建立時間:2008-12-09 orm
* 建立人:張宴(blog.s135.com) 視頻
* 參數說明: server
* $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", "blog.s135.com", "/abc.php");
$server_info2 = HttpVisit("72.249.146.214", "blog.s135.com", "/abc.php");
$server_info3 = HttpVisit("72.249.146.215", "blog.s135.com", "/abc.php");
?>