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

如何规避Google侧限流实现批量推送?PHP+Firebase方案问询

最优FCM批量推送方案(规避限流+满足自定义需求)

关于for循环逐个发送的问题

直接用for循环调用send()单条发送必然会触发FCM限流,而且你当前的代码还有额外问题:每次循环都新建Messaging实例,频繁创建销毁连接不仅效率极低,还会进一步增加被限流的概率——FCM会把这种高频新建连接的行为判定为异常流量。

最优实现方案

1. 基础优化:复用Messaging实例

先把Messaging实例初始化移到循环外部,复用同一个实例减少连接开销:

<?php
// 仅初始化一次,循环内复用
$messaging = (new Factory())->createMessaging();

foreach ($customers as $customer) {
    $message = CloudMessage::withTarget('token', $customer['subscription']['token'])
        ->withNotification(Notification::create(null, $data['message']))
        ->withData($data)
        ->withAndroidConfig($this->prepareAndroidConfig($data))
        ->withApnsConfig($this->prepareApnsConfig($data));
    $messaging->send($message);
}

但这只是基础优化,仍存在单请求频率过高的问题,建议直接使用批量API。

2. 推荐方案:使用FCM批量发送API

FCM提供sendMulticast()(统一内容多token)和sendAll()(自定义内容多消息)两个批量接口,能将多个推送请求打包成一个批量请求发送,大幅降低请求频率,从根本上规避限流。

场景一:所有用户推送内容完全一致

如果所有用户的通知内容、自定义数据都相同,用sendMulticast()最高效:

<?php
$messaging = (new Factory())->createMessaging();

// 收集所有目标设备token
$targetTokens = array_column($customers, 'subscription.token');

// 创建统一的消息模板
$templateMessage = CloudMessage::new()
    ->withNotification(Notification::create(null, $data['message']))
    ->withData($data)
    ->withAndroidConfig($this->prepareAndroidConfig($data))
    ->withApnsConfig($this->prepareApnsConfig($data));

// 批量发送
$sendResponse = $messaging->sendMulticast($templateMessage, $targetTokens);

// 处理发送结果(可选)
echo "成功推送: {$sendResponse->successCount()} 条\n";
echo "推送失败: {$sendResponse->failureCount()} 条\n";
foreach ($sendResponse->failures() as $failure) {
    echo "Token {$failure->target()} 失败原因: {$failure->reason()}\n";
}

场景二:需要为每个用户定制内容(如自定义数据带用户ID)

如果每个用户的消息需要个性化调整,收集所有CloudMessage实例后用sendAll()发送:

<?php
$messaging = (new Factory())->createMessaging();
$messageList = [];

foreach ($customers as $customer) {
    // 为当前用户定制自定义数据
    $customUserData = array_merge($data, [
        'user_id' => $customer['id'],
        'order_no' => $customer['latest_order_no'] // 示例个性化字段
    ]);
    
    $message = CloudMessage::withTarget('token', $customer['subscription']['token'])
        ->withNotification(Notification::create(null, $data['message']))
        ->withData($customUserData)
        ->withAndroidConfig($this->prepareAndroidConfig($data))
        ->withApnsConfig($this->prepareApnsConfig($data));
    
    $messageList[] = $message;
}

// 批量发送所有定制消息
$sendResponse = $messaging->sendAll($messageList);

// 结果处理同上

3. 合规性注意事项

  • 必须确保用户已明确同意接收营销类推送(遵守GDPR、苹果ATT等地区/平台合规要求)
  • 推送内容需符合iOS/Android平台的通知规范(避免过度骚扰,Android需配置合理的通知渠道)
  • 必须提供清晰的退订入口,这是合规的硬性要求

为什么不用FCM自带营销活动?

你提到的两个痛点确实是FCM营销活动的局限性:

  1. 自定义数据支持有限,无法灵活添加业务所需的个性化字段
  2. 受众筛选依赖Firebase内存储的用户数据,无法直接复用你自有系统的用户筛选结果

因此,用自有用户数据+FCM批量API的方案,完全匹配你的需求,同时能有效规避限流风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:32:44