-1

我有一个在 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>
            ';
            
}       
4

1 回答 1

1

http://php.net/manual/en/function.exec.php

如果存在输出参数,则指定的数组将填充命令的每一行输出。此数组中不包含尾随空格,例如 \n。请注意,如果数组已经包含一些元素,则 exec() 将附加到数组的末尾。如果您不希望函数附加元素,请在将数组传递给 exec() 之前对数组调用 unset()。

exec 的输出被附加到$output数组中,因此之前的输出仍然存在于数组中。

于 2013-06-04T12:38:06.570 回答