thinkphp5实现长轮询api接口

/**
     *  轮询获取数据
     * @param int $id
     * @return \think\response\Json
     */
    public function lucky_news($id = 0)
    {
        if ($id == 0) {
            $res = db('lottery_log')->field('id,type,user_id,num,prize_name')->order('id desc')->limit(20)->select();
            foreach ($res as &$v) {
                $v['nickname'] = db('user')->where('id', $v['user_id'])->value('nickname');
                unset($v['user_id']);
            }
            return json(['code' => 1, 'data' => $res]);
        }
 
        return  longPolling(function () use ($id) {   
            $data = db('lottery_log')->field('id,num,prize_name,user_id,type')->where('id', '>', $id)->select();
            foreach ($data as &$v) {
                $v['nickname'] = db('user')->where('id', $v['user_id'])->value('nickname');
                unset($v['user_id']);
            }
            return json(['code' => 1, 'data' => $data ?? (object)[]]);
        });
    }

回调方法核心

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP柚子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值