前言
手里有几套系统正在运维,需要保障正常运行,所以可用性检测就必不可少啦,
以前本来是用的阿里官方的云监控,但现在价格感觉太贵了,不划算
那就自己手搓一个简易版的监控吧。
成品效果展示
代码展示
<?php
// 准备要检查的URL列表
$websites = [
"官方网站" => "http://iiar.cn",
"测试站点" =>"https://test.dalezhi.cn",
// 继续添加更多网站
];
// 各位要换成自己的钉钉机器人token哦
$dingding = "https://oapi.dingtalk.com/robot/send?access_token=****";
foreach ($websites as $name => $url) {
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true); // 获取头信息
curl_setopt($ch, CURLOPT_NOBODY, true); // 仅获取头信息
// 执行cURL请求
curl_exec($ch);
// 获取HTTP状态码
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 关闭cURL会话
curl_close($ch);
// 检查HTTP状态码
if ($http_code == 200) {
echo $name.'ok <br/>';
} else {
$data = [
"text" => [
"content" => $name.",无法访问 ".$url
],
"msgtype" => "text"
];
$jsonData = json_encode($data);
// 初始化cURL会话
$new_url = curl_init($dingding);
// 设置cURL选项
curl_setopt($new_url, CURLOPT_POST, true);
curl_setopt($new_url, CURLOPT_RETURNTRANSFER, true);
curl_setopt($new_url, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
]);
curl_setopt($new_url, CURLOPT_POSTFIELDS, $jsonData);
// 执行cURL请求并获取响应
$response = curl_exec($new_url);
curl_close($ch);
}
}
?>
这段PHP代码的主要功能是检查一组网站的可访问性,如果某个网站无法访问,就向钉钉机器人发送警报。下面是对代码的详细解释:
<?php
// 准备要检查的URL列表
$websites = [
"官方网站" => "http://iiar.cn",
"测试站点" =>"https://test.dalezhi.cn",
// 继续添加更多网站
];
// 各位要换成自己的钉钉机器人token哦
$dingding = "https://oapi.dingtalk.com/robot/send?access_token=****";
- 代码首先定义一个关联数组
$websites
,其中键是网站的描述,值是网站的URL。 - 然后定义一个变量
$dingding
,保存钉钉机器人的API地址及其访问令牌。
foreach ($websites as $name => $url) {
// 初始化cURL会话
$ch = curl_init();
- 使用
foreach
循环遍历$websites
数组,每次循环提取一个网站的名称$name
和 URL$url
。 - 使用
curl_init()
初始化一个cURL会话。
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true); // 获取头信息
curl_setopt($ch, CURLOPT_NOBODY, true); // 仅获取头信息
// 执行cURL请求
curl_exec($ch);
// 获取HTTP状态码
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 关闭cURL会话
curl_close($ch);
- 使用
curl_setopt()
设置cURL选项:CURLOPT_URL
:设置要请求的URL。CURLOPT_RETURNTRANSFER
:将cURL执行结果返回为字符串,而不是直接输出。CURLOPT_HEADER
和CURLOPT_NOBODY
:只获取HTTP头信息,不获取内容。
- 使用
curl_exec()
执行cURL请求。 - 使用
curl_getinfo()
获取HTTP状态码。 - 使用
curl_close()
关闭cURL会话。
// 检查HTTP状态码
if ($http_code == 200) {
echo $name . ' ok <br/>';
} else {
$data = [
"text" => [
"content" => $name . ", 无法访问 " . $url
],
"msgtype" => "text"
];
$jsonData = json_encode($data);
- 检查HTTP状态码是否为200(表示请求成功)。
- 如果成功,输出网站名称和 ‘ok’。
- 如果不成功,准备发送到钉钉的消息内容,使用关联数组
$data
创建消息体,并将其编码为JSON格式。
// 初始化cURL会话
$new_url = curl_init($dingding);
// 设置cURL选项
curl_setopt($new_url, CURLOPT_POST, true);
curl_setopt($new_url, CURLOPT_RETURNTRANSFER, true);
curl_setopt($new_url, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
]);
curl_setopt($new_url, CURLOPT_POSTFIELDS, $jsonData);
// 执行cURL请求并获取响应
$response = curl_exec($new_url);
curl_close($new_url);
}
}
?>
- 再次初始化一个cURL会话,准备向钉钉发送POST请求。
- 设置cURL选项:
CURLOPT_POST
:设置为POST请求。CURLOPT_RETURNTRANSFER
:将响应结果返回为字符串。CURLOPT_HTTPHEADER
:设置HTTP头信息,包括内容类型和内容长度。CURLOPT_POSTFIELDS
:设置POST请求的内容,即之前编码的JSON数据。
- 执行cURL请求,发送消息到钉钉机器人。
- 关闭cURL会话。
当然 上面的步骤 只是写了一个检测流程,实际运行的时候 可以借助宝塔的定时任务,实现1分钟执行一次。