<?php
echo file_get_contents("www.56dxw.com");
?>
但是,在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访问www.56dxw.com了,因为它可能一直重复访问某一台服务器。
而采用依次访问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.ph
p");
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.?>