You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows 10持续运行场景下挂机/BSOD远程邮件告警方案实现求助

这个心跳监控方案完全可行,而且实现起来非常轻量,刚好匹配你的需求——我来一步步给你拆解实现细节、代码参考和部署注意事项:

一、方案可行性分析

这个思路逻辑清晰,依赖的技术都是成熟且易实现的:

  • 本地用Windows自带的工具(curl/任务计划)就能完成心跳发送,不需要额外安装软件
  • 远程PHP服务只需要做简单的文件存储和定时检查,甚至不需要数据库(用文件或轻量SQLite即可)
  • 邮件通知是PHP的基础功能,配置门槛低
  • 整个流程几乎没有单点故障,即使本地脚本偶尔失败,服务器的超时检查也能及时发现
二、本地Windows端BAT心跳脚本

推荐用Windows任务计划程序定时运行脚本(比bat自身循环更可靠,避免脚本崩溃后停止工作),脚本内容如下:

@echo off
:: 获取当前PC的名称,作为唯一标识(方便区分多台设备)
set "PC_ID=%COMPUTERNAME%"
:: 替换成你的远程PHP服务地址
set "HEARTBEAT_URL=http://你的服务器域名/heartbeat.php?pc=%PC_ID%"

:: 发送心跳请求,-s静默模式,-o nul忽略输出
curl -s -o nul "%HEARTBEAT_URL%"

:: 可选:如果curl命令报错(比如没有curl),可以用PowerShell替代
:: powershell -Command "(Invoke-WebRequest -Uri '%HEARTBEAT_URL%' -UseBasicParsing).StatusCode"

任务计划设置步骤:

  1. 打开「任务计划程序」→ 创建基本任务
  2. 触发器选择「每天」,然后设置重复间隔为10分钟,持续时间为「无限期」
  3. 操作选择「启动程序」,浏览选择你的bat脚本
  4. 勾选「不管用户是否登录都要运行」,并设置最高权限(避免网络访问权限问题)
三、远程PHP服务端实现

分为两个核心脚本:心跳接收接口、超时检查+邮件通知脚本

1. 心跳接收接口(heartbeat.php)

负责记录每台PC的最后心跳时间,用文件存储足够轻量:

<?php
// 存储心跳数据的目录,确保服务器有写入权限
$storageDir = __DIR__ . '/heartbeat_storage/';
if (!is_dir($storageDir)) {
    mkdir($storageDir, 0755, true);
}

// 获取PC标识:优先用URL参数里的PC名称, fallback到客户端IP
$pcId = $_GET['pc'] ?? $_SERVER['REMOTE_ADDR'];
$currentTimestamp = time();

// 写入心跳时间到文件
file_put_contents($storageDir . $pcId . '.txt', $currentTimestamp);

// 返回成功响应
http_response_code(200);
echo "Heartbeat received successfully";
?>

2. 超时检查&邮件通知脚本(check_heartbeat.php)

定时检查所有PC的心跳时间,超过阈值就发送邮件:

<?php
// 超时阈值:10分钟心跳间隔 + 2分钟缓冲(避免网络延迟误报)= 12分钟
$timeoutThreshold = 12 * 60;
$storageDir = __DIR__ . '/heartbeat_storage/';
$notificationEmail = '你的接收邮箱@xxx.com';
$emailSubject = 'PC心跳异常告警';

// 遍历所有心跳文件
foreach (glob($storageDir . '*.txt') as $file) {
    $pcId = basename($file, '.txt');
    $lastHeartbeat = (int)file_get_contents($file);
    
    // 判断是否超时
    if (time() - $lastHeartbeat > $timeoutThreshold) {
        $emailContent = "⚠️ 告警通知:\nPC {$pcId} 已超过 " . ($timeoutThreshold/60) . " 分钟未发送心跳,可能出现hang/freeze/BSOD情况,请及时检查设备状态。";
        
        // 发送邮件(如果默认mail()函数不好用,推荐用PHPMailer库走SMTP,更稳定)
        mail($notificationEmail, $emailSubject, $emailContent);
        
        // 重命名文件避免重复发送告警
        rename($file, $file . '_alerted');
    }
}
?>

邮件功能优化建议

如果服务器默认的mail()函数无法正常发送邮件,推荐使用PHPMailer库(开源免费),通过SMTP协议发送(比如用QQ邮箱、163邮箱的SMTP服务),配置更稳定,不容易被当成垃圾邮件。

四、服务器持续监听的设置方法

需要让check_heartbeat.php定时自动运行,不同系统配置方式不同:

Linux服务器(推荐)

crontab定时任务,每5分钟运行一次检查脚本:

  1. 登录服务器,执行crontab -e编辑定时任务
  2. 添加一行:
    */5 * * * * /usr/bin/php /var/www/html/check_heartbeat.php
    
    (替换成你的PHP路径和脚本实际路径)
  3. 保存退出即可,crontab会自动生效

Windows服务器

用「任务计划程序」设置定时任务:

  1. 创建基本任务,触发器选择「每天」,重复间隔5分钟,持续无限期
  2. 操作选择「启动程序」,程序路径填你的PHP.exe路径(比如C:\php\php.exe),添加参数为你的脚本路径(比如"C:\inetpub\wwwroot\check_heartbeat.php"
  3. 勾选最高权限运行
五、服务器负载影响评估

这个方案的负载极低,完全不用担心:

  • 每个心跳请求是简单的GET请求,服务器只做一次文件写入操作,CPU/内存占用可以忽略
  • 检查脚本每次只遍历少量文件(即使有几十台PC),执行时间毫秒级
  • 带宽消耗极小:每个心跳请求的大小不到1KB,每天每台PC仅产生约7MB流量
额外注意事项
  • heartbeat_storage目录设置合适的权限:确保PHP进程有写入权限,但不要给全局可写权限(避免安全风险)
  • 可以给心跳接口加简单的身份验证(比如URL里加一个密钥参数&key=你的密钥,脚本里验证),防止恶意请求
  • 测试阶段可以把超时阈值设短一点(比如2分钟),验证整个流程是否正常工作

内容的提问来源于stack exchange,提问作者Mithun

火山引擎 最新活动