文章大纲

php里判断ip是否可以访问,注意在windows和linux系统里,结果是不一样的

2025-03-11 15:31:05


功能需求


工作里用户有个需求:

某个系统挂掉了,要立马给他们打告警电话



解决方案


最简单的实现方式,那就是ping ip了,php里有exec方法可以用来调用命令。

但是由于ping命令在windows和linux下执行效果不一样,exec执行后结果也有不同,所以编写程序时需要针对系统稍微留意一下。



windows和linux系统ping命令运行的情况


windows系统下,如果可以ping通的话,收到4行数据包就结束了:

可Linux系统下,如果咱们不人为终止的话,它会一直运行下去:


本文为翟码农个人博客里技术大类下php分类的文章,转载请注明出处:http://www.zhai14.com/blog/different-result-got-when-ping-a-certain-ip-via-php-in-windows-or-linux.html



Windows和Linux下exec调用ping命令的结果对比


php
$command = "ping xxx.xxx.xxx.xxx";
exec($command, $output, $return);
echo $return;
print_r($output);
运行上面的代码,如果ip可以访问,windows下结论如下:
  • $return=0
  • $output就是一个数组,每个元素就是上面执行结果每行的内容



如果ip不可以访问,windows下结论如下:


  • $return=1
  • $output数组同样是cmd窗口执行ping命令后的信息数据



Linux下执行上面ping命令需要加个时间限制,否则由于它会一直执行,最终报超时错误:


php
$command = "timeout 10 ping xxx.xxx.xxx.xxx";
exec($command, $output, $return);
echo $return;
print_r($output);
经过实践,timeout命令只在linux系统下有效,如果ip可以访问,最终linux下运行后结论如下:



  • $return=124
  • $output为空数组



如果ip不可以访问,最终linux下运行后结论如下:


  • $return=124(注意这里,跟ip可以访问的情况居然是一样的)
  • $output是在timeout时间内执行ping命令后展示出来的信息



最终程序实现


由于我们系统是Linux,所以通过判断$output是否为空就可以实现判断Ip是否可以访问了。


php
if(empty($output)){
       throw new \Exception("Haikang System Network Crashed");
}



我要评论
评论列表