PHP+SSE流推送技术,如果卡页面的话,记得session存储到redis或memcached

/**
 * @function 与客户端server send event通信方式
 * @param    $callback    callable 回调,若返回数组代表要输出json,返回null代表本次循环不进行输出
 * @param    $millisecond int      数据分发间隔,单位:毫秒
 * @return   string
 * @other    void
 */
function sse($callback, $millisecond = 1000) {
    set_time_limit(0);
    ini_set('output_buffering', 'off');
    ini_set('zlib.output_compression', false);
    while (@ob_end_flush()) {}
    header('Content-Type: text/event-stream; Charset=UTF-8');
    header('Cache-Control: no-cache');
    header('Connection: keep-alive');
    header('X-Accel-Buffering: no');
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Credentials: true");
    header('Access-Control-Allow-Methods: *');
    header('Access-Control-Allow-Headers: *');

    ob_start();
    while (true) {
        $callback_res = $callback();
        if($callback_res !== null) {
            $data = json_encode($callback_res, JSON_UNESCAPED_UNICODE);
            echo "id: ".uniqid('', true)."\n" . "event: message\n" . "data:{$data}\n\n";
            if(isset($callback_res['code']) && $callback_res['code'] === 1){
                break;
            }
        }
        ob_flush();
        flush();
        usleep($millisecond * 1000);
    }
}

前端javascript

                if(!! window.EventSource) {
                    let sse = '';
                    const url = window.location.protocol + "//" + window.location.hostname + ":" +  window.location.port + "/admin/erweifile/goodserweilist/getInitCodeStatus"
                    sse = new EventSource(url);
                    //通信事件
                    sse.onmessage = function (event) {
                        const response = JSON.parse(event.data);
                        // layer.msg(response.msg);
                        Toastr.success(response.msg);
                    };

                    // 打开事件
                    sse.onopen = function (event) { console.log('连接成功'); };

                    //关闭事件
                    sse.onclose = function(event) {console.log('连接关闭');};

                    //错误事件
                    sse.onerror = function (event) {console.error('连接失败');};

                    sse.addEventListener('message', function(event) {
                        const response = JSON.parse(event.data);
                        console.log(response);
                        if (response.code == 1) {
                            console.log('Received end signal from server. Closing SSE connection.');
                            sse.close();
                        }
                    });
                } else {
                    alert('您的浏览器不支持SSE');
                }
            }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 Flask 中的 Session 存储Redis 中,可以使用第三方库 Flask-SessionRedis-Py。下面是一个示例: ```python from flask import Flask, session from redis import Redis from flask_session import Session import os app = Flask(__name__) app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = Redis(host='localhost', port=6379, password='password') app.config['SESSION_COOKIE_NAME'] = 'flask_session' app.config['SESSION_PERMANENT'] = False app.config['SESSION_USE_SIGNER'] = True app.config['SESSION_KEY_PREFIX'] = 'session:' app.config['SECRET_KEY'] = os.urandom(24) Session(app) @app.route('/') def index(): session['username'] = 'Alice' return 'Hello, World!' @app.route('/user') def user(): username = session.get('username') return f'Hello, {username}!' if __name__ == '__main__': app.run() ``` 在上面的示例中,我们首先配置了 Flask-Session,使用了 Redis 作为 Session 存储后端。在配置中,我们指定了 Redis 的主机名、端口号、密码,以及 Session 的一些其他选项,比如 Cookie 名称、前缀等。接着,我们创建了一个路由函数 `/`,在其中存储了一个名为 `username` 的 Session 数据。然后,我们创建了另一个路由函数 `/user`,在其中检索了名为 `username` 的 Session 数据,并返回了一个带有欢迎消息的字符串。 需要注意的是,为了使用 Redis 作为 Session 存储后端,我们需要在系统中安装 Redis,并安装 Redis-Py 库。此外,我们还需要在配置中指定 Redis 的主机名、端口号、密码等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值