php exec ping命令问题

时间:2013-06-04 12:20:02

标签: php codeigniter exec

我在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>
            ';

}       

1 个答案:

答案 0 :(得分:1)

请参阅http://php.net/manual/en/function.exec.php

  

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

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