使用PHP制作主机宕机检测,并发送Mail通知php

/ / 2016-10-10   阅读:2489
这是在公司时候的一段代码,宕机检测的原理,就只有检测是否能够ping通主机,如果不通发送mail,这只是我能想到的办法,有大神如果能想到更好的检测办法,不吝赐教! OK,废话少说,翠花,上代码! (ps:代码中用...
这是在公司时候的一段代码,宕机检测的原理,就只有检测是否能够ping通主机,如果不通发送mail,这只是我能想到的办法,有大神如果能想到更好的检测办法,不吝赐教!
OK,废话少说,翠花,上代码!
(ps:代码中用到了PHPMailer,参考的人,请下载打包代码吧~)

<?php  
  
/** 
 * 检测主机宕机脚本,每10秒检测一次 
 * 若主机宕机会发送邮件通知,发送邮件的间距时间为1小时 
 */  
set_time_limit(0);  
define('ROOT', dirname(__FILE__) . DIRECTORY_SEPARATOR);  
// 检测的IP地址  
$ipAddress = '45.33.36.121';  
// 保存发送mail的时间的文件  
$file = ROOT . 'sendMailTime.txt';  
// 创建文件  
file_put_contents($file, 0);  
if (file_exists($file)) {  
    // 看清楚,这里是无限循环哦  
    while (true) {  
        // ping SinoAngel主机  
        $hostStatus = pingAddress($ipAddress);  
        if (!$hostStatus) {  
            $lastTime = (int) file_get_contents($file);  
            // 距离上次超过一个小时就发送宕机邮件  
            if (time() - $lastTime > 3600) {  
                $row = sendMail([  
                    'subject' => "{$ipAddress}主机宕机警告",  
                    'body' => "dear,{$ipAddress}主机已经宕机,请知晓,发送时间:" . date('Y-m-d H:i:s'),  
                    'address' => [  
                        [  
                            'name' => 'Stronger',  
                            'email' => 'stronger@sinoangel.cn'  
                        ],  
                        [  
                            'name' => '李星',  
                            'email' => 'lixing@sinoangel.cn'  
                        ]  
                    ]  
                ]);  
                if ($row) {  
                    file_put_contents($file, time());  
                }  
            }  
        }  
        sleep(10);  
    }  
} else {  
    exit("fail");  
}  
  
/** 
 * 发送邮件 
 * @param type $config 
 * @return boolean 
 */  
function sendMail($config = []) {  
    require ROOT . 'PHPMailer/PHPMailerAutoload.php';  
    $mail = new PHPMailer;  
    $mail->isSMTP();                                      // 设置邮件使用SMTP  
    $mail->Host = 'smtp.qq.com';                          // 邮件服务器地址  
    $mail->SMTPAuth = true;                               // 启用SMTP身份验证  
    $mail->CharSet = "UTF-8";                             // 设置邮件编码  
    $mail->setLanguage('zh_cn');                          // 设置错误中文提示  
    $mail->Username = 'server@sinoangel.cn';              // SMTP 用户名,即个人的邮箱地址  
    $mail->Password = 'ss123456';                         // SMTP 密码,即个人的邮箱密码  
    $mail->SMTPSecure = 'tls';                            // 设置启用加密,注意:必须打开 php_openssl 模块  
    $mail->Priority = 1;                                  // 设置邮件优先级 1:高, 3:正常(默认), 5:低  
    $mail->From = 'server@sinoangel.cn';                  // 发件人邮箱地址  
    $mail->FromName = 'SinoAngel-Server';                 // 发件人名称  
    if (!isset($config['address']) || empty($config['address'])) {  
        return false;  
    }  
    // 收件人  
    $address = $config['address'];  
    if (isset($address['name']) && isset($address['email'])) {  
        if (empty($address['name']) || empty($address['email'])) {  
            return false;  
        }  
        $mail->addAddress($address['email'], $address['name']);  // 收件人  
    } else {  
        foreach ($address as $addKey => $addVal) {  
            if (!empty($addVal['email']) && !empty($addVal['name'])) {  
                $mail->addAddress($addVal['email'], $addVal['name']);  // 收件人  
            }  
        }  
    }  
    $mail->WordWrap = 50;                                 // 设置自动换行50个字符  
    // 添加附件  
    if (isset($config['file']) && !empty($config['file'])) {  
        if (is_string($config['file'])) {  
            $mail->addAttachment($config['file']);  
        } elseif (is_array($config['file']) && !empty($config['file'])) {  
            foreach ($config['file'] as $file) {  
                $mail->addAttachment($file);  
            }  
        }  
    }  
    $mail->isHTML(true); // 设置邮件格式为HTML  
    // 主题  
    if (isset($config['subject']) && !empty($config['subject'])) {  
        $mail->Subject = $config['subject'];  
    }  
    // 主体内容  
    if (isset($config['body']) && !empty($config['body'])) {  
        $mail->Body = $config['body'];  
    }  
    return $mail->send();  
}  
  
/** 
 * 使用PHP检测能否ping通IP或域名 
 * @param type $address 
 * @return boolean 
 */  
function pingAddress($address) {  
    $status = -1;  
    if (strcasecmp(PHP_OS, 'WINNT') === 0) {  
        // Windows 服务器下  
        $pingresult = exec("ping -n 1 {$address}", $outcome, $status);  
    } elseif (strcasecmp(PHP_OS, 'Linux') === 0) {  
        // Linux 服务器下  
        $pingresult = exec("ping -c 1 {$address}", $outcome, $status);  
    }  
    if (0 == $status) {  
        $status = true;  
    } else {  
        $status = false;  
    }  
    return $status;  
}  
代码到此完!

代码打包下载:点击下载

我要评论

昵称:
验证码:

最新评论

共0条 共0页 10条/页 首页 上一页 下一页 尾页
意见反馈