PHP獲取遠程主機文件內容方法很多,例如:file_get_contents,fopen 等。
<?php echo file_get_contents('http://demo.fdipzone.com/test.php'); ?>
但如果同一域名對應了不同IP,例如 demo.fdipzone.com 對應3個IP192.168.100.101, 192.168.100.102, 192.168.100.103。
則不能使用file_get_contents獲取 192.168.100.101的內容,因為會根據負載均衡原則分配到不同主機,因此並不能確定每次都是訪問192.168.100.101這台主機。
如本地設置IP指定HOST的方法,但如果同一個程序中,需要先訪問192.168.100.101,然後再訪問192.168.100.102,則本地設置IP指定HOST的方法不行,因為不能將多個IP指定同一個域名。
因此,需要使用fsockopen方法去訪問不同IP的主機,然後通過header設置host來訪問。
使用fsockopen需要設置php.ini中的allow_url_fopen為 on。
<?php
/**
* @param String $ip 主機ip
* @param String $host 主機域名
* @param int $port 端口
* @param String $url 訪問的url
* @param int $timeout 超時時間
* @return String
*/
function remote_visit($ip, $host, $port, $url, $timeout){
$errno = '';
$errstr = '';
$fp = fsockopen($ip, $port, $errno, $errstr, $timeout);
if(!$fp){ // connect fail
return false;
}
$out = "GET ${url} HTTP/1.1\r\n";
$out .= "Host: ${host}\r\n";
$out .= "Connection: close\r\n\r\n";
fputs($fp, $out);
$response = '';
// 讀取內容
while($row=fread($fp, 4096)){
$response .= $row;
}
fclose($fp);
$pos = strpos($response, "\r\n\r\n");
$response = substr($response, $pos+4);
return $response;
}
echo remote_visit('192.168.100.101', 'demo.fdipzone.com', 80, '/test.php', 90);
echo remote_visit('192.168.100.102', 'demo.fdipzone.com', 80, '/test.php', 90);
echo remote_visit('192.168.100.103', 'demo.fdipzone.com', 80, '/test.php', 90);
?>
From:csdn博客 傲雪星楓