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);
}
}
?>