sse服务器推送性能,SSE 服务端向客户端推送

本文探讨了传统AJAX的局限性,介绍了Server-Sent Events (SSE)和WebSocket的特性,如何通过它们实现实时数据推送,减少数据库压力。重点讲解了利用SSE自动重连和数据库查询优化的方法,以及在支付回调时结合Redis实现高性能支付结果查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传统的ajax都是由客户端主动去请求,服务端才可以返回数据

而sse是建立一个通道,并且在断线后自动重连,由服务端去推送,不需要客户端去主动请求,只需要建立通道

websocket是双向通信 客户端可以利用通道推送数据给服务端 服务端也可以推送数据给客户端

在有些场景,例如用户端调起支付,没有返回支付通知,需要向后端请求,获取这笔订单的支付结果

例如微信公众号内使用支付宝支付,是调不起来的,只能引导用户浏览器打开,由浏览器调起支付宝客户端进行支付

这时候微信公众号内的页面,是不知道支付结果的

常规操作是ajax 心跳查询 每隔一秒或者两秒向后端请求,获取这笔订单是否是支付成功的

但是性能很差,大量的请求,数据库压力会很大

用sse建立通道,因为这里客户端不需要向服务端推送数据 只需要获取,而且sse可以自动断线重连

服务端只需要每秒查询一次数据库,推送数据给客户端即可 但是这样性能也很差,还是要查库

最好的方法是在支付回调处,修改数据库订单状态的同时,向redis插入 例如order_pay_订单号 后端查询订单状态的时候,就无需就查库,直接去redis查询,如果有这个键,则支付成功,如果没有,则继续查询,这样查询支付结果,不需要查库操作,只需要查询redis,性能很高

客户端demo

if(typeof(EventSource) !== "undefined") {

var source = new EventSource("./test17.php");

source.onmessage = function(res){

var data = JSON.parse(res.data);

console.log(data);

$('#result').html("

" + data.msg + "

");

};

}else{

console.log('您的浏览器不支持SSE');

}

服务端demo<?php

//设置SSE的header头部

header('X-Accel-Buffering: no');

header('Content-Type: text/event-stream');

header('Cache-Control: no-cache');

ob_end_clean();//清空缓冲区并关闭输出缓冲

ob_implicit_flush(1);//每当有输出,例如echo的时候,就直接传输,不在缓冲区

//设置死循环,并sleep

while(true){

//设置要返回的数据

$data = [

"status" => 1,

"msg" => '北京时间'.date('Y-m-d H:i:s'),

];

//按规则去拼接

$str = 'id: '.time()."\n";

$str .= "event: message\n";

$str .= "data: ".json_encode($data)."\n\n";

echo $str;

sleep(1);

}

?>版权属于:本文是原创文章,版权归 吾梦小站 所有。

本站所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

您可以自由地转载和修改,但请务必注明文章来源并且不可用于商业目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值