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

使用旧版FCM API单请求批量发送个性化推送可行吗?

旧版FCM API批量发送个性化推送的方案

可行性说明

旧版FCM Legacy HTTP API(https://fcm.googleapis.com/fcm/send)不支持通过单个HTTP请求发送多条内容不同的个性化消息——它的registration_ids批量发送功能仅能给多个设备推送完全一致的内容。不过可以通过HTTP/2批量请求的方式,在单个TCP连接中发送多个独立的FCM请求,既能复用连接降低开销,又能为每个用户设置专属的个性化内容,效果接近单次请求的效率。

实现步骤(PHP纯cURL)

  1. 准备FCM服务器密钥:从Firebase控制台获取你的服务器密钥。
  2. 构造用户与个性化内容列表:整理需要推送的设备ID(registration_id)和对应的个性化数据(如用户名)。
  3. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:35:28