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

这是在公司时候的一段代码,宕机检测的原理,就只有检测是否能够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' => '[email protected]'
                        ],
                        [
                            'name' => '李星',
                            'email' => '[email protected]'
                        ]
                    ]
                ]);
                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 = '[email protected]';              // SMTP 用户名,即个人的邮箱地址
    $mail->Password = 'ss123456';                         // SMTP 密码,即个人的邮箱密码
    $mail->SMTPSecure = 'tls';                            // 设置启用加密,注意:必须打开 php_openssl 模块
    $mail->Priority = 1;                                  // 设置邮件优先级 1:高, 3:正常(默认), 5:低
    $mail->From = '[email protected]';                  // 发件人邮箱地址
    $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;
}

代码到此完!

代码打包下载地址:链接: http://pan.baidu.com/s/1ntna2Pr 密码: m9iw

谁转载不写我的出处,生儿子没屁眼~

原创地址:http://blog.csdn.net/liruxing1715/article/details/48523083



你可能感兴趣的:(PHP,宕机)