I am sending a APNS to multiple devices in PHP in a loop.
while($row = mysql_fetch_array($result))
{
$row['devicetoken'];
$row['devcertificate'];
$row['prodcertificate'];
if($devprod=="dev"){
$apnsserverurl="ssl://gateway.sandbox.push.apple.com:2195";
$certificatename=$appname."".$row['devcertificate'];
}
elseif($devprod=="prod"){
$apnsserverurl="ssl://gateway.push.apple.com:2195";
$certificatename=$appname."".$row['prodcertificate'];
}
sendpush($row['devicetoken'],$certificatename,$apnsserverurl);
}
Here is the send push function :
function sendpush($deviceToken,$certificatename,$apnsserverurl){
// Get the parameters from http get or from command line
$message = utf8_encode(urldecode($_POST['message']));
$badge = 0;
$sound = "";
// Construct the notification payload
$body = array();
$body['aps'] = array('alert' => $message);
if ($badge)
$body['aps']['badge'] = $badge;
if ($sound)
$body['aps']['sound'] = $sound;
/* End of Configurable Items */
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $certificatename);
$fp = stream_socket_client($apnsserverurl, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
//print "Failed to connect $err";
return;
}
else {
//print "Connection OK";
}
$payload = json_encode($body);
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
print "sending message :" . $payload . "n";
fwrite($fp, $msg);
fclose($fp);
}
The problem that am facing is that its taking too much time. How can I optimise the code?
I am finally using https://code.google.com/p/apns-php/, which make 1 connection only and queues messages
The APNs Best Practices requires you to keep your connection to their servers open:
You may establish multiple connections to the same gateway or to multiple gateway instances. If you need to send a large number of push notifications, spread them out over connections to several different gateways. This improves performance compared to using a single connection: it lets you send the push notifications faster, and it lets APNs deliver them faster.
Keep your connections with APNs open across multiple notifications; don’t repeatedly open and close connections. APNs treats rapid connection and disconnection as a denial-of-service attack. You should leave a connection open unless you know it will be idle for an extended period of time—for example, if you only send notifications to your users once a day it is ok to use a new connection each day.
Source
Apple is probably treating your repeated connections as DoS attacks and throttling the processing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With