php ios 群体推送

果酱很好吃 2014-07-04 12:36:22
描述:用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页面十次,参数不用,就将要推送的用户分成十份。
不知道有什么好的群体推送方式
附上现在的code
function 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);
}
}
...全文
272 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
王者之冕 2015-08-06
  • 打赏
  • 举报
回复
同时启动多个进程进行,遇到无效的tocken断开之后,去apns获取一次断开点的无效tocken,然后在从无效tocken下一个开始继续推送。
果酱很好吃 2014-07-07
  • 打赏
  • 举报
回复
感谢各位的回答,但是在用pcntl的时候,遇到了另一个问题 http://bbs.csdn.net/topics/390829010
傲雪星枫 2014-07-07
  • 打赏
  • 举报
回复
要快就只能開多進程了。
果酱很好吃 2014-07-07
  • 打赏
  • 举报
回复
是异步的,但是每次打开,关闭,太浪费时间,不能在半小时内推送完。 用xmpphp倒是没考虑过,既然是异步推送,不用持久连接。 现在我的解决办法是:用pcntl,开十个进程执行
huangxy10 2014-07-06
  • 打赏
  • 举报
回复
试试xmpphp,使用聊天服务器来实现,可能更靠谱一些。
断点Bingo 2014-07-06
  • 打赏
  • 举报
回复
这种东西肯定需要用异步去实现

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧