1. 程式人生 > >同一域名對應不同IP,訪問指定主機檔案內容的方法

同一域名對應不同IP,訪問指定主機檔案內容的方法

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);

?>