如何用PHP cURL检测REST API状态?构建服务宕机重试通知机制
如何使用PHP的cURL检测REST API是否宕机并实现重试通知机制?
没问题,我来帮你搞定这个API宕机检测的需求!下面是完整的实现方案,包含基础检测逻辑、重试机制和通知功能:
一、基础的API可用性检测逻辑
首先,我们用PHP的cURL工具发起请求,通过超时设置和错误捕获来判断API是否宕机。核心参数说明:
CURLOPT_FAILONERROR: 当HTTP状态码大于等于400时,将cURL请求标记为失败CURLOPT_CONNECTTIMEOUT: 设置连接到服务器的最大超时时间(秒)CURLOPT_TIMEOUT: 设置整个cURL请求的最大执行时间(秒)
基础检测的代码片段如下:
function checkApi($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 7); // 连接超时7秒 curl_setopt($ch, CURLOPT_TIMEOUT, 7); // 总请求超时7秒 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将结果返回而不是直接输出 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 如果是HTTPS,暂时关闭证书验证(生产环境建议开启) $response = curl_exec($ch); $error = curl_error($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 判断是否宕机:请求失败、有错误、或者HTTP状态码异常 if (!$response || $error || $httpCode >= 500) { return false; } return true; }
二、实现重试机制与管理员通知
根据你的需求:若服务宕机达7秒则重试一次,重试失败则发送通知,我们可以在基础检测的基础上封装一层逻辑:
function monitorApi($url, $adminEmail) { // 第一次检测 $isAlive = checkApi($url); if (!$isAlive) { echo "第一次检测API宕机,开始重试...\n"; // 重试一次(可选:重试前短暂等待,避免立即重试的网络波动问题) sleep(1); $isAlive = checkApi($url); if (!$isAlive) { echo "重试失败,发送通知给管理员...\n"; // 发送通知(这里以邮件为例,可替换为短信、企业微信等) $subject = "紧急通知:API服务宕机"; $message = "检测到API服务 {$url} 已宕机,两次检测均失败,请及时处理!"; $headers = "From: monitoring@yourdomain.com\r\n"; mail($adminEmail, $subject, $message, $headers); } else { echo "重试成功,API恢复正常\n"; } } else { echo "API运行正常\n"; } } // 使用示例 $apiUrl = "https://your-rest-api.com/health"; $adminEmail = "admin@yourdomain.com"; monitorApi($apiUrl, $adminEmail);
补充说明
- 生产环境中,建议开启
CURLOPT_SSL_VERIFYPEER并配置正确的CA证书,保障HTTPS请求的安全性 - 通知方式可以根据需求扩展,比如调用短信API、发送企业微信机器人消息等
- 可以把这个脚本加入定时任务(比如Linux的crontab),实现周期性的API监控
内容的提问来源于stack exchange,提问作者Kuldeep Singh Potiwal
相关产品推荐
相关产品推荐

