2

I am new to php. The script succeeds if i send manually changing the start and end values each time. But, it fails when trying to send via a while loop and displays this error:

Request Entity Too Large. Error 413

GCMSendMessage:

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);

include("GCMPushMessage.php");
$new_array= array();

$i = 0; // counter 

$mysqli = mysqli_connect("localhost", "root", "xxx", "xxx");
while ($i < n) //n is the (total registration id's)/1000
{
 $new_array[]   = null;
 $start         = ($i * 1000); 
 $end           = $start + 1000; //GCM Limit of 1000 users per notification
 $queryregid    = "SELECT gcm_regid FROM `gcm_users` WHERE id >$start AND id <=$end";
 $result_select = $mysqli->query($queryregid);
 if ($result_select->num_rows > 0) {
     // output data of each row
     while ($row = $result_select->fetch_assoc()) {
         $new_array[] = $row["gcm_regid"]; // Inside while loop
     }
 }  else {
    echo "0 results";
}

$apiKey = "xxx";
$param1 = "XXX";
$param2 = "AAA";
$param3 = '0';

$gcpm = new GCMPushMessage($apiKey);
$gcpm->setDevices($new_array);

 $response = $gcpm->send($message, array(
     'param1' => $param1,
     'param2' => $param2,
     'param3' => $param3
 ));

 $i = $i + 1; // counter increment
}
print "Response=$response"; 

?>

GCMPushMessage.php:

<?php
/*
    Class to send push notifications using Google Cloud Messaging for Android

Example usage
-----------------------
$an = new GCMPushMessage($apiKey);
$an->setDevices($devices);
$response = $an->send($message);
-----------------------

$apiKey Your GCM api key
$devices An array or string of registered device tokens
$message The mesasge you want to push out

@author Matt Grundy

Adapted from the code available at:
http://stackoverflow.com/questions/11242743/gcm-with-php-google-cloud-messaging

*/

 class GCMPushMessage {

var $url = 'https://android.googleapis.com/gcm/send';
var $serverApiKey = "";
var $devices = array();

/*
    Constructor
    @param $apiKeyIn the server API key
*/
function GCMPushMessage($apiKeyIn){
    $this->serverApiKey = $apiKeyIn;
}

/*
    Set the devices to send to
    @param $deviceIds array of device tokens to send to
*/
function setDevices($deviceIds){

    if(is_array($deviceIds)){
        $this->devices = $deviceIds;
    } else {
        $this->devices = array($deviceIds);
    }

}

/*
    Send the message to the device
    @param $message The message to send
    @param $data Array of data to accompany the message
*/
function send($message, $data = false){

    if(!is_array($this->devices) || count($this->devices) == 0){
        $this->error("No devices set");
    }

    if(strlen($this->serverApiKey) < 8){
        $this->error("Server API Key not set");
    }

    $fields = array(
        'registration_ids'  => $this->devices,
        'data'              => array( "message" => $message ),
    );

    if(is_array($data)){
        foreach ($data as $key => $value) {
            $fields['data'][$key] = $value;
        }
    }

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

    // Open connection
    $ch = curl_init();

    // Set the url, number of POST vars, POST data
    curl_setopt( $ch, CURLOPT_URL, $this->url );

    curl_setopt( $ch, CURLOPT_POST, true );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

    curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );

    // Avoids problem with https certificate
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);

    // Execute post
    $result = curl_exec($ch);

    // Close connection
    curl_close($ch);

    return $result;
}

function error($msg){
    echo "Android send notification failed with error:";
    echo "\t" . $msg;
    exit(1);
    }
} 

?>
Geek_2501
  • 31
  • 2
  • Just as a test, can you see if the error still occurs if $message, $param1, $param2, and $param3 are null? – Koh Jun 03 '15 at 01:49
  • @Koh It works with all the params when I manually enter 1 registration ID instead of array in the setDevices() function & it also works when I manually add start and end values instead of while loop approach. – Geek_2501 Jun 03 '15 at 13:48
  • The error means that what you are sending to the server is larger than what the GCM server expected. When you manually added values, what start and end values did you put? 0 and 1000? – Koh Jun 03 '15 at 15:46
  • @Koh yeah. 0 & 1000, 1000 & 2000 and so on... – Geek_2501 Jun 03 '15 at 17:02

0 Answers0