<?php
class Health {
public static $status;
public function __construct()
{
}
public function check($ip, $port){
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($sock);
socket_connect($sock,$ip, $port);
socket_set_block($sock);
self::$status = socket_select($r = array($sock), $w = array($sock), $f = array($sock), 5);
return(self::$status); 
}
public function checklist($lst){
}
public function status(){
switch(self::$status)
{
case 2:
echo "Clo
sedn";
break;
case 1:
echo "Openningn";
break;
case 0:
echo "Timeoutn";
break;
}  
}
}
$ip='192.168.2.10';
$port=80;
$health = new Health();
$health->check($ip, $port);
$health->status();
<? 
/** 
* 说明:检测
url地址是否有效 
*/ www.jb200.com
error_reporting(E_ALL & ~E_NOTICE); 
function _GetMicrotime() 
{ 
list($usec, $sec) = explode(" ",microtime()); 
return ((float)$usec + (float)$sec); 
} 
function _CatInfoToArray($urls) 
{ 
/* 
$url格式:<a href="http://wwww.xxxx.com:88800/root/file" target="_blank">http://wwww.xxxx.com:88800/root/file</a>
剥离信息url集合的信息 
取得 $add 地址 $ip $port $froot $httpd 
将上述信息存入一个新的数组 
*/ 
$newurlarr = array(); 
foreach ($urls as $uk=>$url) 
{ 
$urlarr = explode("://",$url); 
$urlarr = explode("/",$urlarr[1]); 
$hostinfo = explode(":",$urlarr[0]); // <a href="http://www.xxxx.com:88800" target="_blank">www.xxxx.com:88800</a>
$add[$uk] = $hostinfo[0]; 
if($hostinfo[1]!="") 
{ 
$port[$uk] = $hostinfo[1]; //如果地址带端口,使用地址给出的端口 
} 
else 
{ 
$port[$uk] = getservbyname('www', 'tcp'); //如果地址没带端口,返回wwww端口 
} 
/*开始重新组合,生成新的文件探测地址*/ 
if(count($urlarr) !=1 && $urlarr[1]!="") 
{ 
foreach ($urlarr as $k=>$urlitem) 
{ 
if($k !=0) $froot[$uk] .= "/".$urlitem; 
} 
} 
if($froot[$uk]=="") $froot[$uk]="/"; //如果探测址为空,就探测根目录 
/* 
OK,现在我们开始创建http报头 
*/ 
$ip[$uk] = gethostbyname($hostinfo[0]); //返回ip 
$httpd[$uk] = "GET $froot[$uk] HTTP/1.1rn"; 
$httpd[$uk] .= "Host: ".$hostinfo[0]."rn"; 
$httpd[$uk] .= "Connection: Closernrn"; 
/*信息收集完毕,创建数组*/ 
$newurlarr[$uk] = array($url,$ip[$uk],$port[$uk],$froot[$uk],$httpd[$uk]); 
} 
return $newurlarr; 
} 
function _Socket($infos) 
{ 
/* 
将_CatInfoToArray生成的数组一次进行Socket分析 
*/ 
foreach ($infos as $k=>$info) 
{ 
/* 
开始创建多Socket线程 
*/ 
$socket{$k} = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建Socket 
} 
foreach ($infos as $k=>$info) 
{ 
$starttime{$k} = _GetMicrotime(); //取得开始时间 
$result[$k] = @socket_connect($socket{$k}, $info[1], $info[2]);//发起连接 
if (!$result[$k]) 
{ 
$rsl[$k]="链接超时"; 
} 
else 
{ 
@socket_write($socket{$k}, $info[4], strlen($info[4])); //发送Http报头 
$out = @socket_read($socket{$k}, 20); //读取返回,只读取50个字节的数据就行了 
@socket_close($socket{$k}); // 关闭socket连接 
$out = explode("n",$out); //分离每一行 
$http = explode(" ",$out[0]);//第一行包含了报头是否存在的信息 
if($http[1]=="404") //如果是404,就是不存在 
{ 
$rsl[$k]="无效链接"; 
} 
else 
{ 
$rsl[$k]="有效链接"; 
} 
} 
$runtime[$k] = _GetMicrotime() - $starttime{$k}; //计算探测时间 
$socketarr[$k] = array($info[0],$rsl[$k],$runtime[$k]); //返回新的数组,包含了地址,探测结果,以及探测消耗时间 
} 
return $socketarr; 
} 
function _CheckLink($array) 
{ 
$a = _CatInfoToArray($array); 
$b = _Socket($a); 
return $b; 
} 
/*-----------------------------开始使用------------------------------------------------*/ 
echo "[链接探测器]<pre>"; 
$time_start = _GetMicrotime(); 
/*链接需要以数组的方式提交查询*/ 
$urlarr = array( 
"http://vwww.jb200.com/1.htm", 
"http://www.baidu.com", 
"http://www.sina.com.cn/3.htm", 
"http://www.google.com/4.htm" 
); 
echo "OK,我们来打印一下查询到的信息吧<br>"; 
print_r(_CheckLink($urlarr)); //打印查询的信息,是一个数组哦] 
$time_end = _GetMicrotime(); 
echo "页面执行时间 "; 
echo $time_end-$time_start;
?>