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

来源:互联网 发布:逆战卡数据教程 编辑:程序博客网 时间:2024/06/08 02:57

这是在公司时候的一段代码,宕机检测的原理,就只有检测是否能够ping通主机,如果不通发送mail,这只是我能想到的办法,有大神如果能想到更好的检测办法,不吝赐教!

OK,废话少说,翠花,上代码!

(ps:代码中用到了PHPMailer,参考的人,请下载打包代码吧~)

[php] view plain copy
  1. <?php  
  2.   
  3. /** 
  4.  * 检测主机宕机脚本,每10秒检测一次 
  5.  * 若主机宕机会发送邮件通知,发送邮件的间距时间为1小时 
  6.  */  
  7. set_time_limit(0);  
  8. define('ROOT', dirname(__FILE__) . DIRECTORY_SEPARATOR);  
  9. // 检测的IP地址  
  10. $ipAddress = '45.33.36.121';  
  11. // 保存发送mail的时间的文件  
  12. $file = ROOT . 'sendMailTime.txt';  
  13. // 创建文件  
  14. file_put_contents($file, 0);  
  15. if (file_exists($file)) {  
  16.     // 看清楚,这里是无限循环哦  
  17.     while (true) {  
  18.         // ping SinoAngel主机  
  19.         $hostStatus = pingAddress($ipAddress);  
  20.         if (!$hostStatus) {  
  21.             $lastTime = (int) file_get_contents($file);  
  22.             // 距离上次超过一个小时就发送宕机邮件  
  23.             if (time() - $lastTime > 3600) {  
  24.                 $row = sendMail([  
  25.                     'subject' => "{$ipAddress}主机宕机警告",  
  26.                     'body' => "dear,{$ipAddress}主机已经宕机,请知晓,发送时间:" . date('Y-m-d H:i:s'),  
  27.                     'address' => [  
  28.                         [  
  29.                             'name' => 'Stronger',  
  30.                             'email' => 'stronger@sinoangel.cn'  
  31.                         ],  
  32.                         [  
  33.                             'name' => '李星',  
  34.                             'email' => 'lixing@sinoangel.cn'  
  35.                         ]  
  36.                     ]  
  37.                 ]);  
  38.                 if ($row) {  
  39.                     file_put_contents($file, time());  
  40.                 }  
  41.             }  
  42.         }  
  43.         sleep(10);  
  44.     }  
  45. else {  
  46.     exit("fail");  
  47. }  
  48.   
  49. /** 
  50.  * 发送邮件 
  51.  * @param type $config 
  52.  * @return boolean 
  53.  */  
  54. function sendMail($config = []) {  
  55.     require ROOT . 'PHPMailer/PHPMailerAutoload.php';  
  56.     $mail = new PHPMailer;  
  57.     $mail->isSMTP();                                      // 设置邮件使用SMTP  
  58.     $mail->Host = 'smtp.qq.com';                          // 邮件服务器地址  
  59.     $mail->SMTPAuth = true;                               // 启用SMTP身份验证  
  60.     $mail->CharSet = "UTF-8";                             // 设置邮件编码  
  61.     $mail->setLanguage('zh_cn');                          // 设置错误中文提示  
  62.     $mail->Username = 'server@sinoangel.cn';              // SMTP 用户名,即个人的邮箱地址  
  63.     $mail->Password = 'ss123456';                         // SMTP 密码,即个人的邮箱密码  
  64.     $mail->SMTPSecure = 'tls';                            // 设置启用加密,注意:必须打开 php_openssl 模块  
  65.     $mail->Priority = 1;                                  // 设置邮件优先级 1:高, 3:正常(默认), 5:低  
  66.     $mail->From = 'server@sinoangel.cn';                  // 发件人邮箱地址  
  67.     $mail->FromName = 'SinoAngel-Server';                 // 发件人名称  
  68.     if (!isset($config['address']) || empty($config['address'])) {  
  69.         return false;  
  70.     }  
  71.     // 收件人  
  72.     $address = $config['address'];  
  73.     if (isset($address['name']) && isset($address['email'])) {  
  74.         if (empty($address['name']) || empty($address['email'])) {  
  75.             return false;  
  76.         }  
  77.         $mail->addAddress($address['email'], $address['name']);  // 收件人  
  78.     } else {  
  79.         foreach ($address as $addKey => $addVal) {  
  80.             if (!empty($addVal['email']) && !empty($addVal['name'])) {  
  81.                 $mail->addAddress($addVal['email'], $addVal['name']);  // 收件人  
  82.             }  
  83.         }  
  84.     }  
  85.     $mail->WordWrap = 50;                                 // 设置自动换行50个字符  
  86.     // 添加附件  
  87.     if (isset($config['file']) && !empty($config['file'])) {  
  88.         if (is_string($config['file'])) {  
  89.             $mail->addAttachment($config['file']);  
  90.         } elseif (is_array($config['file']) && !empty($config['file'])) {  
  91.             foreach ($config['file'as $file) {  
  92.                 $mail->addAttachment($file);  
  93.             }  
  94.         }  
  95.     }  
  96.     $mail->isHTML(true); // 设置邮件格式为HTML  
  97.     // 主题  
  98.     if (isset($config['subject']) && !empty($config['subject'])) {  
  99.         $mail->Subject = $config['subject'];  
  100.     }  
  101.     // 主体内容  
  102.     if (isset($config['body']) && !empty($config['body'])) {  
  103.         $mail->Body = $config['body'];  
  104.     }  
  105.     return $mail->send();  
  106. }  
  107.   
  108. /** 
  109.  * 使用PHP检测能否ping通IP或域名 
  110.  * @param type $address 
  111.  * @return boolean 
  112.  */  
  113. function pingAddress($address) {  
  114.     $status = -1;  
  115.     if (strcasecmp(PHP_OS, 'WINNT') === 0) {  
  116.         // Windows 服务器下  
  117.         $pingresult = exec("ping -n 1 {$address}"$outcome$status);  
  118.     } elseif (strcasecmp(PHP_OS, 'Linux') === 0) {  
  119.         // Linux 服务器下  
  120.         $pingresult = exec("ping -c 1 {$address}"$outcome$status);  
  121.     }  
  122.     if (0 == $status) {  
  123.         $status = true;  
  124.     } else {  
  125.         $status = false;  
  126.     }  
  127.     return $status;  
  128. }  
0 0