我在codeigniter中创建了一个网站。我正在使用php exec(“ping”)命令ping一些服务器,交换机/路由器和复制机,以确保它们已启动。当设备发生故障时,我会收到一封电子邮件,告诉我哪个设备已关闭以及它何时停机。
我正在运行的问题是,我有一个foreach语句,从数据库中获取每个设备的IP地址,并在其上运行exec命令。如果让我们说位于第5个位置的设备已关闭,则其后的所有其他设备都会显示它们已关闭,即使它们已启动。我不知道为什么。我在exec之前使用了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>
';
}
答案 0 :(得分:1)
请参阅http://php.net/manual/en/function.exec.php
如果输出参数存在,那么指定的数组将是 填充了命令的每一行输出。尾随 空格,例如\ n,不包含在此数组中。请注意,如果 数组已经包含一些元素,exec()会附加到 数组的结尾。如果您不希望该函数追加元素, 在将数组传递给exec()之前调用数组上的unset()。
exec的输出被附加到$output
数组,因此先前的输出仍然存在于数组中。