You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Guzzle拉取Atera Restful API全量告警数据并存入MongoDB

解决方案

Atera告警接口的单页20条返回限制是服务端强制规则,不存在可绕过的请求参数,无法实现全量数据一次性拉取,你可以通过循环分页拉取的方式收集全量数据,参考实现逻辑如下:

实现思路

  • 初始请求第一页数据
  • 每次请求后判断返回的nextLink是否为空,不为空则继续请求下一页
  • 把每页返回的items数组合并到总结果集中
  • 所有页拉取完成后统一写入MongoDB,数据量较大时也可以边拉边写避免内存占用过高

代码示例

<?php
use GuzzleHttp\Client;

$client = new Client();
// 初始化总数据集
$allAlerts = [];
// 初始请求地址
$requestUri = 'https://app.atera.com/api/v3/alerts';
$header = [
    'headers' => [
        'X-Api-Key' => '你的实际API密钥'
    ],
    // 配置超时时间避免接口无响应卡住
    'timeout' => 30.0
];

do {
    $res = $client->get($requestUri, $header);
    $data = json_decode($res->getBody()->getContents(), true);
    
    // 合并当前页的告警数据
    if (!empty($data['items'])) {
        $allAlerts = array_merge($allAlerts, $data['items']);
        // 数据量过大时可以直接在这里写入MongoDB,不需要存到总数组
        // 示例:$mongoCollection->insertMany($data['items']);
    }
    
    // 处理下一页地址的实体字符转义
    $nextLink = str_replace('&amp;', '&', $data['nextLink'] ?? '');
    $requestUri = $nextLink;
    
    // 按需添加请求延迟,避免触发API限流规则
    usleep(500000); // 0.5秒延迟,可根据实际情况调整
} while (!empty($requestUri));

// 拉取完成后批量写入MongoDB(如果没有边拉边写的话)
// $mongoCollection->insertMany($allAlerts);
echo "共拉取到" . count($allAlerts) . "条告警数据";
?>

注意事项

  • 可以在拉取过程中记录当前页码,出现异常中断后可以从断点继续拉取,不需要重新拉取全量
  • 超过6000条数据不建议全部存在PHP数组中,优先选择边拉边写的方式,避免超出PHP内存上限

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:15:08