我正在尝试使用PHP在IOS上发送推送通知,有300,000个设备令牌
我编写了一个小例程,每次执行时例程都会向100个设备发送通知,并且在1秒后再次执行延迟例程并将通知发送到下一个100个设备,例程如下
$body['aps'] = array('alert' => 'Energy is full',
'sound' => 'default',
'badge' => '0'
);
$url = 'ssl://gateway.push.apple.com:2195';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ProductionCertificate.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', 'my pass phrase');
stream_context_set_option($ctx, 'ssl', 'cafile', 'trusted_ca.cer');
$fp = stream_socket_client($url, $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp) { return -1;}
foreach($OneHundredTokens as $deviceToken) {
$payload = json_encode($body, 256);
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
}
fclose($fp);
有些时候这个例程工作得很好,我已经看到在设备上发送了通知。
但有时会出现以下错误
警告:fwrite():SSL:已建立的连接被中止 主机上的软件。
我的问题是:
首饰
发送大约90,000
个推送通知(单个连接打开100个,延迟1秒后接下来100个)
大约60,000
失败(fwrite
失败),上面的错误和大约30,000
推送成功发送(fwrite返回正整数,表示写入的字节数)。