| 关键词: 服务器 PHP 72.249 http abc 多个 域名 blog 如用 均衡 |
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.php、http://72.249.146.215/abc.php的方法,在这三台服务器上的Web Server配有多个虚拟主机时,也是不行的。 通过设置本地hosts也不行,因为hosts不能设置多个IP对应同一个域名。 那就只有通过PHP和HTTP协议来实现:访问abc.php时,在header头中加上blog.s135.com域名。于是,我写了下面这个PHP函数: 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.?> |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|