同一域名对应多个IP时,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.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. /************************ 
  3. * 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容 
  4. * 创建时间:2008-12-09 
  5. * 创建人:张宴(blog.s135.com) 
  6. * 参数说明: 
  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. ?>  
时间: 2024-08-03 15:09:40

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

请教:单网卡绑定多IP时socket通信出现链接不上的问题

问题描述 socket客户服务器模式的程序服务器客户端都是单网卡服务器端单IP客户端单IP时,socket正常链接,没问题.客户端多个网段的IP,同时添加了多个网关,socket链接会出现建立链接不上的情况,后来在客户端bind一个IP,在测试机器上没有问题,在另一台机器上还是会出现链接不上的问题.单位所有出口全封,代码没有拷贝出来.外出联调时发现的错误,当时没有打印出具体错误值.这里就是想遇到过类似问题的兄台们给个思路,帮忙分析一下.org 解决方案 解决方案二:up解决方案三:1关注解决方案

网站-救命……域名能ping通 ip 能访问 外网域名无法访问 服务器自己用域名可以访问 wamp环境

问题描述 救命--域名能ping通 ip 能访问 外网域名无法访问 服务器自己用域名可以访问 wamp环境 网络上各种答案各种配置都改烂了一点效果没有 不要怀疑我的毅力 一天了 具体情况是 ping域名能返回正确的服务器ip 浏览器用ip地址可以看到正确的内容 浏览器用域名只返回Bad Request 不是电脑问题 其他人访问也一样 服务器环境为wamp 改遍了所有apache绑定域名的方法没有一点效果 服务器自己访问域名可以看到正确的内容 没有在服务器上设置localhost文件 服务器系统为

jvm-apache连接数过多时域名无法访问,ip访问tomcat应用正常

问题描述 apache连接数过多时域名无法访问,ip访问tomcat应用正常 请教下大家: 我官网www域名解析到一台装有apache的服务器上,二级域名从apache转到tomcat服务器上. tomcat和apache的最大连接数我都设置了1500. 目前出现这种现象: 通过观察tomcat manage控制台发现,8009端口Current thread busy: 1001,域名服务无法访问,但是ip访问8080应用还是可以的.一旦出现这个问题,导致我www页面无法访问,二级域名应用无法

详解在使用CDN加速时Nginx获取用户IP的配置方法_nginx

关于CDN内容分发网络(Content delivery network或Content distribution network,缩写:CDN)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快.更可靠地将音乐.图片.视频.应用程序及其他文件发送给用户,来提供高性能.可扩展性及低成本的网络内容传递给用户. 内容分发网络的总承载量可以比单一骨干最大的带宽还要大.这使得内容分发网络可以承载的用户数量比起传统单一服务器多.也就是说,若把有100Gbps处理能力的服务器放在只有

同局域网内,已知一个设备的外网IP,如何获取其外网IP?

问题描述 在同一个局域网内,已知一个设备的外网IP,如何获取其内网IP?用C#代码该怎么实现?或者是,在Socket通讯中,怎么获取远端设备的内网IP? 解决方案 本帖最后由 GAMU_kaito 于 2014-02-13 10:46:12 编辑解决方案二:补充一下,这个时候那个设备是在线的,但是那天设备不是本地机器个人的思路是:1.首先获取到局域网内所有在线的设备的外网IP和内网IP2.根据已知的外网IP查找到对应的内网IP但是一来,个人不知道第一步该怎样用代码实现:二来,觉得这样的方法似乎很

ip网址怎么获取客户端ip地址

问题描述 比如地址是:1.51.23.111/index.aspx没有域名怎么获取客户端ip地址///<summary>///获取远程访问用户的Ip地址///</summary>///<returns>返回Ip地址</returns>protectedstringGetIps(){stringloginip="";//Request.ServerVariables[""]--获取服务变量集合if(Request.Ser

获取远程用户真实IP地址

**//// <summary>   /// 最大限度获取远程用户真实IP地址   /// </summary>   /// <returns></returns>   private string GetClientIP()   ...{        if(Request.ServerVariables["HTTP_VIA"]!=null)       ...{           return Request.ServerVaria

[开发故事]第四回:应用反射在运行时动态获取类型信息

引言 网友hbfly,对于我在[你必须知道的.NET]第三十回:.NET十年(下)一文中 关于"当应用attribute进行运行时反射"的论述,希望举例说明,他提出了自己 的想法:[你必须知道的.NET]第二十四回:认识元数据和IL(上)[你必须知道的.NET]第二十五回:认识元数据和IL(中)[你必须知道的.NET]第二十六回:认识元数据和IL(下) [MyAttribute("text.....")] public mymethod() { //我可以再方法内部

php利用腾讯ip分享计划获取地理位置示例分享

 这篇文章主要介绍了php利用腾讯ip分享计划获取地理位置示例,大家参考使用吧 代码如下: <?php function getIPLoc_QQ($queryIP){     $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;     $ch = curl_init($url);     curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');   curl_setopt($ch, CUR