项目需求,后端需要用到长轮询,设计思路就是默认请求数据,当有新的请求就执行新的数据,比如信息播报,

  1. /**
  2. * 轮询获取数据
  3. * @param int $id
  4. * @return \think\response\Json
  5. */
  6. public function lucky_news($id = 0)
  7. {
  8. if ($id == 0) {
  9. $res = db('lottery_log')->field('id,type,user_id,num,prize_name')->order('id desc')->limit(20)->select();
  10. foreach ($res as &$v) {
  11. $v['nickname'] = db('user')->where('id', $v['user_id'])->value('nickname');
  12. unset($v['user_id']);
  13. }
  14. return json(['code' => 1, 'data' => $res]);
  15. }
  16.  
  17. return longPolling(function () use ($id) {
  18. $data = db('lottery_log')->field('id,num,prize_name,user_id,type')->where('id', '>', $id)->select();
  19. foreach ($data as &$v) {
  20. $v['nickname'] = db('user')->where('id', $v['user_id'])->value('nickname');
  21. unset($v['user_id']);
  22. }
  23. return json(['code' => 1, 'data' => $data ?? (object)[]]);
  24. });
  25. }

回调方法核心

  1. function longPolling($callback)
  2. {
  3. session_write_close(); //前面的session数据存入或读取,然后关闭session. 防止session阻塞
  4. ignore_user_abort(false); //停止脚本运行
  5. set_time_limit(30); //设置脚本允许的时间 0:没有时间限制
  6.  
  7. for ($i = 0; $i < 25; $i++) {
  8. // echo str_repeat(" ", 4000); //把''重复4000次
  9. $return_data = $callback();
  10. if ($return_data) {
  11. return $return_data;
  12. }
  13. sleep(1);
  14. ob_flush(); //输出缓冲区的内容 // 必须和下面同时使用 flush()
  15. flush(); //刷新缓冲区的内容 该函数将当前为止程序的所有输出发送到用户的浏览器,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲
  16. }
  17. ob_end_flush(); //输出缓冲区内容并关闭缓冲
  18. return json(['code' => 1, 'data' => (object)array()]);
  19. }

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!