You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动