初衷
现在有个需求,就是后台发布一个系统消息,所有的用户都将接收后台发布的消息。
这个问题该如何解决?
解决方案
使用激光推送
我在代码中使用了第三方工具,使用极光推送,但是发现我们的服务器,再使用用出现了,服务器瘫痪,这个解决方案不可执行使用redis缓存
直接看代码
/**
* @发送
*/
public function send(){
if( !M()->autoCheckToken($_POST) ) $this->error('禁止站外提交!');
unset($_POST['__hash__']);
$id = I('id');
$no = M('Notice')->where(['id'=>$id])->find();
$data = [
'is_fans'=>1,
'is_del'=>1
];
$user = M('User')->where($data)->select();
if (M('Notice')->where(['id'=>$id])->save(['status'=>2,'stime'=>time()])){
// $redis = new \Redis();
// $redis->connect('127.0.0.1',6379);
foreach ($user as $k=>$v){
//入栈
$a = serialize($v);
$redis->rpush("notice",$a);
// M('Message')->add(['type'=>1,'user_id2'=>$v['user_id'],'content'=>$no['content'],'intime'=>time(),'date'=>date('Y-m-d',time())]);
// //极光推送
// push5($v['user_id'],$no['content'],$v['alias'],'',1);
// set_time_limit(0);
}
$this->success('发送成功!',U('message'));
}else{
$this->error('发送失败',U('message'));
}
}
/**
* redis发送系统通知
*/
public function send_pop(){
$no = M('Notice')->where(array('status'=>2))->order('id desc')->limit(1)->find();
$redis = new \Redis();
$redis->connect('127.0.0.1',6379);
for ($i=1;$i<1000;$i++){
$data = $redis->LPOP('notice');
if (!empty($data)) {
$res = unserialize($data);
M('Message')->add(['type'=>1,'user_id2'=>$res['user_id'],'content'=>$no['content'],'intime'=>time(),'date'=>date('Y-m-d',time())]);
//极光推送
// push5($res['user_id'],$no['content'],$res['alias'],'',1);
}else{
break;
}
// sleep(rand() % 3);
}
}