使用旧版FCM API单请求批量发送个性化推送可行吗?
旧版FCM API批量发送个性化推送的方案
可行性说明
旧版FCM Legacy HTTP API(https://fcm.googleapis.com/fcm/send)不支持通过单个HTTP请求发送多条内容不同的个性化消息——它的registration_ids批量发送功能仅能给多个设备推送完全一致的内容。不过可以通过HTTP/2批量请求的方式,在单个TCP连接中发送多个独立的FCM请求,既能复用连接降低开销,又能为每个用户设置专属的个性化内容,效果接近单次请求的效率。
实现步骤(PHP纯cURL)
- 准备FCM服务器密钥:从Firebase控制台获取你的服务器密钥。
- 构造用户与个性化内容列表:整理需要推送的设备ID(
registration_id)和对应的个性化数据(如用户名)。 - 使用cURL multi_handle批量发送:利用cURL的多句柄功能,在同一个会话中发送多个FCM请求,复用HTTP/2连接。
代码示例
<?php // FCM服务器密钥 $fcmServerKey = 'YOUR_FCM_SERVER_KEY'; // 待推送的用户列表:每个元素包含设备ID和个性化用户名 $users = [ ['registration_id' => 'DEVICE_ID_1', 'username' => '张三'], ['registration_id' => 'DEVICE_ID_2', 'username' => '李四'], ['registration_id' => 'DEVICE_ID_3', 'username' => '王五'], ]; // 初始化cURL多句柄 $multiHandle = curl_multi_init(); $curlHandles = []; foreach ($users as $user) { // 构造个性化消息体 $message = [ 'to' => $user['registration_id'], 'notification' => [ 'title' => "您好,{$user['username']}!", 'body' => '这是给您的专属推送消息' ], 'data' => [ 'username' => $user['username'], 'custom_key' => '自定义数据' ] ]; // 创建单个cURL句柄 $ch = curl_init('https://fcm.googleapis.com/fcm/send'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($message)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: key=' . $fcmServerKey, 'Content-Type: application/json' ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 启用HTTP/2(需确保cURL支持) curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); $curlHandles[] = $ch; curl_multi_add_handle($multiHandle, $ch); } // 执行批量请求 $running = null; do { curl_multi_exec($multiHandle, $running); } while ($running > 0); // 处理响应结果 foreach ($curlHandles as $ch) { $response = curl_multi_getcontent($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo "响应状态码:{$httpCode}\n"; echo "响应内容:{$response}\n\n"; curl_multi_remove_handle($multiHandle, $ch); curl_close($ch); } curl_multi_close($multiHandle); ?>
注意事项
- HTTP/2支持:确保你的PHP环境中的cURL版本≥7.43.0,且编译时开启了HTTP/2支持(可通过
curl_version()查看http2字段是否为true)。 - 请求限制:FCM对批量请求有频率限制,避免短时间内发送过多请求导致被限流。
- 错误处理:代码中可添加更多错误捕获逻辑,比如检查cURL执行错误、FCM返回的错误响应等。
内容的提问来源于stack exchange,提问作者cbdev
相关产品推荐
相关产品推荐

