Maison  >  Article  >  développement back-end  >  同一域名对应多个IP时,PHP获取远程网页内容的函数

同一域名对应多个IP时,PHP获取远程网页内容的函数

WBOY
WBOYoriginal
2016-06-20 12:35:11783parcourir

PHP获取远程网页内容有多种方式,例如用自带的file_get_contents、fopen等函数。

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.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函数:

Java代码  

  1. /************************ 

  2. * 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容 

  3. * 创建时间:2008-12-09 

  4. * 创建人:张宴(blog.s135.com) 

  5. * 参数说明: 

  6. *    $ip   服务器的IP地址 

  7. *    $host   服务器的host名称 

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

  9. * 返回值: 

  10. *    获取到的远程网页内容 

  11. *    false   访问远程网页失败 

  12. ************************/  

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

  14. {     

  15.     $errstr = '';     

  16.     $errno = '';  

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

  18.     if (!$fp)     

  19.     {     

  20.          return false;     

  21.     }     

  22.     else    

  23.     {     

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

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

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

  27.         fputs ($fp, $out);     

  28.   

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

  30.            $response .= $line;  

  31.         }  

  32.         fclose( $fp );  

  33.   

  34.         //去掉Header头信息  

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

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

  37.       

  38.         return $response;     

  39.     }     

  40. }  

  41.   

  42. //调用方法:  

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

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

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

  46. ?>  


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:php与MysqlArticle suivant:explode 的技巧