我正在通过php脚本向我的应用程序用户发送批量推送通知。我的用户群很小,只有675名左右。
当我只有几百个用户时,脚本运行良好。但是在大约400个用户标记时,脚本突然出现504错误超时。有些用户会收到推送通知,有些则不会。
这是我正在使用的脚本。在网上找到。 (谢谢你写的人。)
$query ="SELECT * FROM ios_tokens";
$execute=mysqli_query($conn,$query);
while($row=mysqli_fetch_array($execute)){
$deviceToken[] = $row['devicetoken'];
}
if(empty($feedback_tokens)){
//Start IOS Push Notification
$passphrase = 'abcd1234';
$data = array('mtitle'=>'My App', 'mdesc'=>$notify_msg);
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'cert.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
// Create the payload body
$body['aps'] = array(
'alert' => array(
'title' => $data['mtitle'],
'body' => $data['mdesc'],
),
'badge' => 1,
'sound' => 'default'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
foreach($deviceToken as $token){
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $token)) . pack ("n",strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
}
// Close the connection to the server
fclose($fp);
有人对为什么只有部分通知通过有任何想法吗?我尝试在每发送50条消息后发出一个sleep命令,但此后我没有超时,但是一些通知没有通过。
foreach($deviceToken as $i => $token){
if ($i > 0 && $i % 50 == 0) {
echo 'sleeping for 8 seconds...'."/r/n<br>";
sleep(8);
}
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $token)) . pack ("n",strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
}
更多数据。前100个左右发出的通知始终会通过。只是最后几百个没有成功。
感谢您的帮助。