这是在公司时候的一段代码,宕机检测的原理,就只有检测是否能够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;
- }