【问题标题】:Fixing GCM 1000 message limit, help loop script修复 GCM 1000 消息限制,帮助循环脚本
【发布时间】:2016-07-14 07:55:01
【问题描述】:

我正在使用 PHP 向用户发送 GCM 通知。基于他们保存在服务器上的 SQL 中的令牌。但我一次发送的通知限制为 1000 条,

这是我的工作代码,现在我需要对其进行编辑以循环该过程,并分段发送 5000 个通知,1000 个多于 1000 个等。

这是我的 PHP 代码,以及一个我没有在此处发布的简单 HTML,

        <?php

        $mysqlHost = "";
        $mysqlUser = "";
        $mysqlPwd = ";
        $mysqlDbname = "";


        class GCM {
        function __construct(){}

        public function send_notification($registatoin_ids,$data) {

    // GOOGLE API KEY
    define("GOOGLE_API_KEY","************");
    $url="https://android.googleapis.com/gcm/send";
    $fields=array(
        "registration_ids"=>$registatoin_ids,
        "data"=>$data,
    );
    //var_dump($fields);
    $headers=array(
        "Authorization: key=".GOOGLE_API_KEY,
        "Content-Type: application/json"
    );
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch,CURLOPT_POSTFIELDS,json_encode($fields));
    $result_gcm=curl_exec($ch);
    if($result_gcm===FALSE){
        die("Curl failed: ".curl_error($ch));
    }
    curl_close($ch);
    //echo $result_gcm;
    }
    }



    // Create connection
    $conn = mysqli_connect($mysqlHost, $mysqlUser, $mysqlPwd, $mysqlDbname);

    // Check connection
    if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
    }


    $result = $conn->query("SELECT * FROM users WHERE users_android_token IS                   NOT NULL AND users_android_token <> ''");

    $android_tokens = array();
    $x=0;

    if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
     $android_tokens[] = $row["users_android_token"];
$x++;
}
    } else {
echo "0 results";
    }
    $conn->close();

    $title = $_POST['title'];
    $msg = $_POST['message'];
    $link = $_POST['link'];

    if ($android_tokens != array()) {
$gcm=new GCM();
$data=array("title"=>$title,"description"=>$msg,"link"=>$link);
$result_android=$gcm->send_notification($android_tokens,$data);
    }
    ?>

【问题讨论】:

  • 你说的fix是什么意思?
  • 我的意思是如何增加数字,我现在可以通过循环过程来完成,分段发送每 1000 个通知,而不是一次。但我不知道如何正确地做到这一点
  • 我明白了。不幸的是,1000 是最大值(无论您是否使用 GCM/FCM),唯一的方法是实现一个循环。
  • 是的,我知道,我在这里发布问题的方式,我需要帮助来循环它
  • 好的。你修改了标题,那就更好了。最初的标题令人困惑。

标签: php android google-cloud-messaging


【解决方案1】:

而不是通过registrationId发送通知,为什么不使用按主题发送通知。您只需要让客户端订阅某个主题即可。

在 GCM 中,您可以使用以下代码发送通知主题:

function send_notification_topic($topicname, $message){
    $url = 'https://android.googleapis.com/gcm/send';
    $fields = array(
         'to' => '/topics/' . $topicname,
         'data' => $message
        );

    $headers = array(
         'Authorization: key=AIzablablablayourServerKey',
         'Content-Type: application/json'
        );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

    $result = curl_exec($ch);
    if($result === FALSE){
        die('Curl failed : ' . curl_error($ch));
    }
    curl_close($ch);
    return $result;
}

【讨论】:

  • 你只需要将 fcm 更改为 gcm :)
  • 没关系,我想你是怎么发送通知的,google gcm 限制是每个连接 1000 个,所以你不能一次发送超过 1000 个,需要将它们分成部分
  • 您误解了先生,1000 是同时的,因此,如果您有 100 万会员,则需要 1000 秒才能到达所有用户。我认为这很公平。
  • google 不傻,他们不可能有只能达到 1000 个会员的功能吧?
  • 是的,但您需要循环连接,例如我有 2000 个 regid,我通过面板发送通知,它会说 1000 个未发送,只有 1000 个用户会收到我的通知。其他1000什么都没有。因此需要在 2 次发送和连接 gcm 中拆分 2000 个用户。如果一个数字 > 1000,依此类推。
【解决方案2】:

使用此代码分割您的代币。

if ($android_tokens != array()) {
$gcm  = new GCM();
$data = array("title" => $title,"description" => $msg,"link" => $link);

//Divide array into 1000 tokens
$splitTokens = array_chunk($android_tokens, 1000);

//loop the array
//Obs: for looping notification may push slow 

foreach($splitTokens as $tokens) {
    $result_android = $gcm -> send_notification($tokens,$data);
}

}

对于划分 GCM 可能会缓慢推送通知。最多需要 2 - 10 分钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多