我有一个在 codeigniter 中创建的网站。我正在使用 php exec("ping") 命令 ping 一些服务器、交换机/路由器和复印机,以确保它们已启动。当设备出现故障时,我会收到一封电子邮件,告诉我哪个设备出现故障以及它出现故障的时间。
我遇到的问题是,我有一个 foreach 语句,它从数据库中获取每个设备的 IP 地址,并在其上运行 exec 命令。如果假设处于第 5 位的设备处于停机状态,那么在它之后的所有其他设备都显示它们处于停机状态,即使它们处于上升状态。我不确定为什么。我在执行之前使用了 fsockopen 函数,我对此很满意,我只是遇到了一个问题,它多次 ping 设备,每次失败时都会发送一封电子邮件,所以我们收到很多电子邮件告诉一个设备是向下。
我的代码如下,如果你们有任何建议,请告诉我。谢谢
foreach ($devices->result() as $device)
{
$ping_host = exec("ping -n 1 ".$device->ip, $output, $result);
if($result==0)
{
if(count(preg_grep('/Destination host unreachable/i', $output)) == 0)
{
//This will show blinking green next device that is up
$ping = "<img src=\"".base_url()."assets/images/icons/blinking_green_light.gif\"/><img src=\"".base_url()."assets/images/icons/blinking_green_light.gif\"/>";
}
else
{
$ping = "<img src=\"".base_url()."assets/images/icons/blinking_red_light.gif\"/><img src=\"".base_url()."assets/images/icons/blinking_red_light.gif\"/>";
$this->email->from('sender email address', 'name');
$this->email->to(recipient email);
$this->email->subject($device->host.' is down');
$this->email->message('the following devices are not reached.<br/>
Host Name: '.$device->host.'<br/>
IP Address: '.$device->ip.'
');
$this->email->send();
}
}
elseif ($result==1)
{
$ping = "<img src=\"".base_url()."assets/images/icons/blinking_red_light.gif\"/><img src=\"".base_url()."assets/images/icons/blinking_red_light.gif\"/>";
}
echo '
<tr id="'.$device->id.'" class="selected_tr">
<td align="center"><img src="'.$device->img_path.'" /><br/>
<a href="'.$device->host.'">'.ucfirst($device->host).'</a></td>
<td align="center">
<a href="'.$device->ip.'">'.$device->ip.'</a></td>
<td align="center">'.$device->port.'</td>
<td align="center">'.$device->category.'</td>
<td align="center">'.$ping.'</td>
</tr>
<tr><td colspan="5" height="10px"><hr></td></tr>
';
}