php ios 群体推送
描述:用php 做服务器端,向ios的apns推送通知,附上代码public static function apple_push($data,$devicetoken){
$passphrase='123456';
$ckfile=ck.pem;
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $ckfile);
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195',$err,$errstr, 60, stream_client_connect|stream_client_persistent, $ctx);
//$fp = stream_socket_client('ssl://gateway.push.apple.com:2195',$err,$errstr, 60, stream_client_connect|stream_client_persistent, $ctx);
if(!$fp){
return false;
}
$payload=json_encode($data);
$pushdata = chr(0) . pack('n', 32) . pack('h*', $devicetoken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $pushdata, strlen($pushdata));
if(!$result){
file_put_contents(dirname(__file__)./pushlog.txt,$result.'-'.$devicetoken.-.microtime().php_eol,file_append);
}
fclose($fp);
}
单条推送是没有问题的
问题描述:
现在要求群体推送,之前,我写的是用socket链接后,循环写入,再关闭fp,但是有些人没有收到推送,网上说,要是其中一个人的手机令牌(devicetoken)有问题的话,苹果服务器就会中断这个socket链接。
我就改成每个用户都用socket打开,写入,关闭,但是我发现这样很慢,半个小时都不能推送9000条,虽然是后台推送,但是要求劲量在半小时内推送完。
我先在想到的办法是:同时访问这个php页面十次,参数不用,就将要推送的用户分成十份。
不知道有什么好的群体推送方式
附上现在的codefunction iospush($tid,$subject,$pushinfo){
$data['aps']=array(
'alert'=>$subject,
'sound'=>'default',
'type'=>'thread',
'tid'=>$tid,
);
$passphrase='123456';
$ckfile=ck.pem;
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $ckfile);
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$payload=json_encode($data);
foreach($pushinfo as $info){
$devicetoken=$info['phonetoken'];
$pushdata = chr(0) . pack('n', 32) . pack('h*', $devicetoken) . pack('n', strlen($payload)) . $payload;
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195',$err,$errstr, 60, stream_client_connect|stream_client_persistent, $ctx);
//$fp = stream_socket_client('ssl://gateway.push.apple.com:2195',$err,$errstr, 60, stream_client_connect|stream_client_persistent, $ctx);//正式服务器
if(!$fp){
file_put_contents(dirname(__file__)./pushlog.txt,$err.'-'.$errstr.'-60'.php_eol,file_append);
continue;
}
$result = fwrite($fp, $pushdata, strlen($pushdata));
if(!$result){
file_put_contents(dirname(__file__)./pushlog.txt,$result.'-'.$devicetoken.php_eol,file_append);
}
fclose($fp);
}
}
------解决方案--------------------
这种东西肯定需要用异步去实现
------解决方案--------------------
试试xmpphp,使用聊天服务器来实现,可能更靠谱一些。
------解决方案--------------------
要快就只能開多進程了。