1. 程式人生 > >DNS輪詢 PHP獲取遠端網頁內容的函式

DNS輪詢 PHP獲取遠端網頁內容的函式

 PHP獲取遠端網頁內容有多種方式,例如用自帶的file_get_contents、fopen等函式。
  
  <?php
  echo file_get_contents("http://blog.s135.com/abc.php");
  ?>
  
  但是,在DNS輪詢等負載均衡中,同一域名,可能對應多臺伺服器,多個IP。假設blog.s135.com被DNS解析到 72.249.146.213、72.249.146.214、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.phphttp://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函式:
  <?php
  /************************
  * 函式用途:同一域名對應多個IP時,獲取指定伺服器的遠端網頁內容
  * 建立時間:2008-12-09
  * 建立人:張宴(blog.s135.com)
  * 引數說明:
  *    $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");
  ?>