同一域名對應多個IP時,PHP獲取遠程網頁內容的函數

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.phphttp://72.249.146.215/abc.php 的方法,在這三臺服務器上的Web Server配有多個虛擬主機時,也是不行的。

  經過設置本地hosts也不行,由於hosts不能設置多個IP對應同一個域名。

  那就只有經過PHP和HTTP協議來實現:訪問abc.php時,在header頭中加上blog.s135.com域名。因而,我寫了下面這個PHP函數:服務器

Java代碼  收藏代碼負載均衡

  1. <?php  函數

  2. /************************ url

  3. * 函數用途:同一域名對應多個IP時,獲取指定服務器的遠程網頁內容 spa

  4. * 建立時間:2008-12-09 orm

  5. * 建立人:張宴(blog.s135.com) 視頻

  6. * 參數說明: server

  7. *    $ip   服務器的IP地址 

  8. *    $host   服務器的host名稱 

  9. *    $url   服務器的URL地址(不含域名) 

  10. * 返回值: 

  11. *    獲取到的遠程網頁內容 

  12. *    false   訪問遠程網頁失敗 

  13. ************************/  

  14. function HttpVisit($ip, $host, $url)     

  15. {     

  16.     $errstr = '';     

  17.     $errno = '';  

  18.     $fp = fsockopen ($ip, 80, $errno, $errstr, 90);  

  19.     if (!$fp)     

  20.     {     

  21.          return false;     

  22.     }     

  23.     else    

  24.     {     

  25.         $out = "GET {$url} HTTP/1.1\r\n";  

  26.         $out .= "Host:{$host}\r\n";     

  27.         $out .= "Connection: close\r\n\r\n";  

  28.         fputs ($fp, $out);     

  29.   

  30.         while($line = fread($fp, 4096)){  

  31.            $response .= $line;  

  32.         }  

  33.         fclose( $fp );  

  34.   

  35.         //去掉Header頭信息  

  36.         $pos = strpos($response, "\r\n\r\n");  

  37.         $response = substr($response, $pos + 4);  

  38.       

  39.         return $response;     

  40.     }     

  41. }  

  42.   

  43. //調用方法:  

  44. $server_info1 = HttpVisit("72.249.146.213""blog.s135.com""/abc.php");  

  45. $server_info2 = HttpVisit("72.249.146.214""blog.s135.com""/abc.php");  

  46. $server_info3 = HttpVisit("72.249.146.215""blog.s135.com""/abc.php");  

  47. ?>  

相關文章
相關標籤/搜索