使用PHP制作主机宕机检测,并发送Mail通知php
这是在公司时候的一段代码,宕机检测的原理,就只有检测是否能够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;
}
代码到此完!
代码打包下载:点击下载
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;
}
代码到此完!
代码打包下载:点击下载
最新评论
热门推荐
我要评论