使用kreait/firebase-php发送多播推送遇请求超限问题求助
解决kreait/firebase-php发送批量推送时的请求数量限制问题
问题原因
这个错误的核心原因是Firebase Cloud Messaging(FCM)的批量推送接口本身限制单请求最多处理500个推送令牌,而你当前使用的kreait/firebase-php版本可能没有自动帮你拆分超过500的令牌列表,导致一次性传入985个令牌时触发了FCM的内置限制。
你提到的另一个脚本能正常处理1000个令牌,大概率是因为它手动实现了令牌的分批次拆分,确保每个请求的令牌数都控制在500以内。
解决方法
这里提供两种可行的解决方案,你可以根据自己的情况选择:
1. 升级kreait/firebase-php到最新版本
如果你使用的是v6及以上版本的库,sendMulticast方法已经内置了自动拆分令牌的功能——它会自动将超过500个的令牌分成多个批次发送,无需手动处理。
执行以下命令升级到最新稳定版:
composer update kreait/firebase-php
升级后直接运行你原来的代码即可,库会自动处理批次拆分。
2. 手动拆分令牌列表(兼容性更强)
如果暂时无法升级库版本,或者想确保兼容性,你可以手动将令牌数组拆分成每个子数组最多500个元素,然后循环发送每个批次:
$push_input = [ 'data' => [ 'title' => 'PUSH MESSAGE TITLE', 'subtext' => 'PUSH MESSAGE BODY' ] ]; try { $factory = (new Factory)->withServiceAccount('FILE PATH OF CREDENTIAL JSON'); // 或使用自动加载凭证 $messaging = $factory->createMessaging(); $message = CloudMessage::fromArray($push_input); // 原始令牌列表 $tokens = ['T1', 'T2', ..., 'T1000']; // 拆分为每500个令牌一组 $tokenBatches = array_chunk($tokens, 500); foreach ($tokenBatches as $batch) { $result = $messaging->sendMulticast($message, $batch); // 可选:记录每个批次的发送结果 log_message('info', "批次发送完成:成功{$result->successCount()}条,失败{$result->failureCount()}条"); } } catch (Exception $e) { log_message('error', $e->getMessage()); }
这种方式完全绕过了库的自动处理逻辑,直接遵守FCM的接口限制,无论你使用哪个版本的库都能正常工作。
内容的提问来源于stack exchange,提问作者Alex Brend




