PHP实现ping api
大家好我是山河,今天给大家分享点技术,很多小伙伴问我怎么写php的ping api,我跟他们说用exec或者systerm函数来实现,但是他们说主机商不允许使用这两个函数,让我想想办法。
既然不能直接使用dos命令来搞ping,那我们只能模拟ping了。
话不多说,上效果图
嘿嘿,这样效果也差不多。
我们运用php的fsockopen函数来模拟 HTTP连接 实现ping的效果,但实际与ping差距是很大的,因为ping是ICMP协议,而我们是使用tcp或者udp协议。
话不多说,上代码,本代码的模拟ping是使用tcp协议 (HTTP/1.1 和 HTTP/2 都是基于 TCP 传输协议),
HTTP/3 是基于 UDP 传输协议
<?php /* 此模拟ping仅仅只是 使用 HTTP协议 模拟ping。不是真正的ping,与真正的 ping 误差很大。 */ // ping次数 $num = 5; // 执行时间 function times(){ list($usec,$sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } function demo($host,$port=80,$i) { if($i == 0) { echo 'Ping 域名 '.$host.'IP: ['.gethostbyname($host).'] 端口:'.$port.'<br />'; } echo ping($host,$port); } function ping($host,$port=80) { $starttime= times(); $ip = gethostbyname($host); $fp = @fsockopen($host,$port); if(!$fp) { return 'ping超时!'; } else { $get = "GET / HTTP/1.1\r\nHost:".$host."\r\nConnect:".$port."Close\r\n"; fputs($fp,$get); fclose($fp); $nowtime = times(); $time = $nowtime - $starttime; $time = ceil($time * 1000); return 'Ping from '.$ip.':'.$port.' time = '.$time.'ms<br />'; } } for($i = 0;$i < $num;$i++){ echo demo('blog.shanhe.info',80,$i); //每次运行中间间隔1S sleep(1); //刷新输出缓存 ob_flush(); flush(); }
好了,我是山河,本文到此结束