GCM 推送通知发送在 PHP 中需要很长时间

我正在使用一个类从 PHP 发送基于 GCM 的推送通知.我从 https://www.phpclasses.org/package/8987-PHP-Send-push-notifications-to-Android-and-iOS-devices.html

I am using a class to send GCM based Push Notification from PHP. I downloaded this class from https://www.phpclasses.org/package/8987-PHP-Send-push-notifications-to-Android-and-iOS-devices.html

一切都按预期进行,但由于 Android 用户数量已超过 3K,现在发送推送通知需要很长时间.发送推送通知大约需要 2 到 2 个半小时.

All things are working as expected but as the number of Android users has crossed 3K now sending push notification is taking very long time. It takes around 2 to 2 and a half hours to send Push Notification.

而且我无法刷新页面甚至关闭浏览器,否则操作将中止.

And I cannot refresh the page to even close the browser otherwise the operation gets aborted.

如何提高从我的脚本发送推送通知的速度.

How can I increase the speed of sending Push Notification from my script.

我用于发送推送通知的重要代码部分如下:

The important part of code that I am using for sending Push Notification is give below:

if (isset($_POST['sendmessage']) && !empty($_POST['sendmessage'])) {
    $errorvalid = array();
    $success = TRUE;
    $requiredFields = array("subject_notify" => "Please Enter Notify Subject.", "subject_main" => "Please Enter Main Subject.", "msg" => "Please Enter Message");
        foreach ($requiredFields as $fld => $msg) {
            $v = $_POST[$fld];
            if (empty($v)) {
                    $success = false;
                    $errorvalid[$fld] = $msg;
            } else {
                    $errorvalid[$fld] = '';
                    $$fld = $v;
            }
        }
    if($success)  
    {
        $get_result = mysql_query("SELECT ps_mobile_id, ps_service_type FROM push_service", $con);

        $row_result = mysql_fetch_assoc($get_result);
        $totalRows_row_result = mysql_num_rows($get_result);

        echo "Total Records: ".$totalRows_row_result;
        echo "<br/>";

        //Set parameters to hold time out error
        set_time_limit(0);
        error_reporting(E_ALL);
        //ob_implicit_flush(TRUE);
        //ob_end_flush();

        if($totalRows_row_result > 0) {
                $push = new pushmessage();
                do {
                        $MobID = $row_result['ps_mobile_id'];
                        $MobType = $row_result['ps_service_type'];

                        echo "Mobile ID: ".$MobID;
                        echo "<br/>";

                        if($MobType == 1)
                        {
                                //Android
                                $params = array("pushtype"=>"android", "msg"=>$msg, "registration_id"=>$MobID, "subject_main"=>$subject_main, "subject_notify"=>$subject_notify, );
                                $rtn = $push->sendMessage($params);
                                //Push the message
                                $rtn = $push->sendMessage($params);
                        }
                        else
                        {
                                //iOS
                                //$params   = array("pushtype"=>"android", "msg"=>$msg, "registration_id"=>$MobID, //"subject_main"=>$subject_main, "subject_notify"=>$subject_notify, );
                                //$rtn = $push->sendMessage($params);
                                //Push the message
                                //$rtn = $push->sendMessage($params);
                        }

                        echo "<br/>";
                        print_r($rtn);
                        echo "<br/>";

                        //ob_flush();   //Push data to Browser

                }while ($row_result = mysql_fetch_assoc($get_result));
                //header("Location: index.php");
                echo "<h2>Completed Sending Pusht Message</h2>";
                echo "<br/><br/>";
                echo "Rediricting.... Please wait....";
                echo "<br/><br/>";
                echo '<meta http-equiv="refresh" content="3;url=http://mypresence.in/pushtibooks/pushmsg/" />';
        }
        else
        {
                echo "NO Data";
        }
    }    
}

TIA

杨洋

推荐答案

您正在一一发送推送通知.这就是为什么它需要太多时间.您可以使用设备 ID 发送群组消息.检查此文档.

You are sending push notification one by one . That's why it takes too much time. You can send group message using device id. Check this documentation .

使用下面的代码向安卓发送推送通知.同样,您也可以在 iOS 上执行此操作.

Use below code for sending push notification to android. Same way you can do this on iOS also.

//For andriod
    $get_result = mysql_query("SELECT ps_mobile_id FROM push_service where ps_service_type = 1", $con);

   // $row_result = mysql_fetch_assoc($get_result);
    $totalRows_row_result = mysql_num_rows($get_result);

    $MobIDs=array();

         while($row = mysql_fetch_assoc($get_result)){
            $MobIDs[] = $row;
         }
     $params = array("pushtype"=>"android", "msg"=>$msg, "subject_main"=>$subject_main, "subject_notify"=>$subject_notify, );
    $rtn = $push->sendMessageAndroid($MobIDs, $params)

sendMessageAndroid($registration_id, $params)

 public $androidAuthKey = "Android Auth Key Here"; 
public $iosApnsCert = "./certification/xxxxx.pem"; 

 /** 
 * For Android GCM 
 * $params["msg"] : Expected Message For GCM 
 */ 
private function sendMessageAndroid($registration_id, $params) { 
    $this->androidAuthKey = "Android Auth Key Here";//Auth Key Herer 

    ## data is different from what your app is programmed 
    $data = array( 
            'registration_ids' => array($registration_id), 
            'data' => array( 
                            'gcm_msg' => $params["msg"] 
                        ) 
            ); 


    $headers = array( 
    "Content-Type:application/json", 
    "Authorization:key=".$this->androidAuthKey 
    ); 


    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send"); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); 
    $result = curl_exec($ch); 
    //result sample {"multicast_id":6375780939476727795,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1390531659626943%6cd617fcf9fd7ecd"}]} 
    //http://developer.android.com/google/gcm/http.html // refer error code 
    curl_close($ch); 

    $rtn["code"] = "000";//means result OK 
    $rtn["msg"] = "OK"; 
    $rtn["result"] = $result; 
    return $rtn; 

 } 

请注意:不要为每个请求发送超过 1000 个设备 ID.如果您有 1000 多个用户.然后将您的 MobIDs 切成小于 1000

Please note that: Don't send more than 1000 device id per request. If you have more than 1000 users. then slice your MobIDs with a size less than 1000

相关文章