GCM推送通知在PHP中花费很长时间

时间:2017-08-31 07:34:07

标签: php android push-notification notifications google-cloud-messaging

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

下载了这个课程

所有事情都按预期工作,但随着Android用户数量超过3K,现在发送推送通知需要很长时间。发送推送通知大约需要2到2个半小时。

我无法刷新页面甚至关闭浏览器,否则操作会中止。

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

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

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

Yogi Yang

1 个答案:

答案 0 :(得分:1)

您正在逐个发送推送通知。这就是为什么它需要太多时间。您可以使用设备ID发送群组消息。查看this文档。

使用以下代码向Android发送推送通知。在iOS上也可以这样做。

//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个用户。然后切片大小小于1000的MobIDs