如何规避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营销活动的局限性:
- 自定义数据支持有限,无法灵活添加业务所需的个性化字段
- 受众筛选依赖Firebase内存储的用户数据,无法直接复用你自有系统的用户筛选结果
因此,用自有用户数据+FCM批量API的方案,完全匹配你的需求,同时能有效规避限流风险。
内容的提问来源于stack exchange,提问作者Kristi Jorgji
相关产品推荐
相关产品推荐

