用PHP发送IOS批量推送通知的正确方法

我试图发送推送通知在IOS使用PHP有30万设备令牌

我已经写了一个小例程,每次执行例程发送通知到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:build立的连接被主机中的软件中止。

我的问题是:

  1. 发送批量通知是否正确?
  2. 我打开一个连接一次,为100个设备写入数据(通知),然后closures连接,还是打开每个设备令牌的连接然后closures?
  3. 什么是造成以上错误?

调查结果发送了大约90,000推送通知(单连接100次,延时1秒后100次)大约有60,000失败( fwrite失败),出现上述错误,大约30,000推送成功发送(fwrite返回正整数,表示写入的字节数)。