Laravel如何快速创建简单事件流


这篇文章主要介绍“Laravel如何快速创建简单事件流”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel如何快速创建简单事件流”文章能帮助大家解决问题。在开始之前,你需要在机器上安装 Laravel。我将在这个演示中使用 DigitalOcean Ubuntu Droplet 。如果你愿意,你可以使用我的会员代码获得免费 $100 免费云主机域名DigitalOcean 积分来启动你自己的服务器!如果你还没有,可以按照本教程中的步骤进行操作:How to Install Laravel on DigitalOcean with 1-Click或者可以使用这个很棒的脚本进行安装:LaraSail让我们从创建一个处理事件流的控制器开始。使用以下命令:

phpartisanmake:controllerEventStreamController

这将在 AppHttpControllers 目录中创建一个新控制器。一旦我们创建了我们的控制器,我们需要向它添加 stream 方法。 该方法将用于发送事件流。打开 EventStreamController.php 文件并添加以下代码:

stream(function(){
while(true){
echo"event:pingn";
$curDate=date(DATE_ISO8601);
echo'data:{"time":"'.$curDate.'"}';
echo"nn";

$trades=Trade::latest()->get();
echo'data:{"total_trades":'.$trades->count().'}'."nn";

$latestTrades=Trade::with('user','stock')->latest()->first();
if($latestTrades){
echo'data:{"latest_trade_user":"'.$latestTrades->user->name.'","latest_trade_stock":"'.$latestTrades->stock->symbol.'","latest_trade_volume":"'.$latestTrades->volume.'","latest_trade_price":"'.$latestTrades->stock->price.'","latest_trade_type":"'.$latestTrades->type.'"}'."nn";
}

ob_flush();
flush();

//如果客户端中止连接,则中断循环(关闭页面)
if(connection_aborted()){break;}
usleep(50000);//50ms
}
},200,[
'Cache-Control'=>'no-cache',
'Content-Type'=>'text/event-stream',
]);
}}

这里要注意的主要事项是:我们使用 response()->stream() 方法来创建事件流。然后我们有一个无限循环,每隔50ms发送一次事件流。如果客户端中止连接,我们使用 ob_flush()flush() 来发送事件流。我们使用 sleep() 发送下一个事件之前等待50ms。我们使用 connection_aborted() 来中断循环,如果客户端中止了连接。我们使用 CarbonCarbon 类获取当前日期。我们使用 AppModelsTrade 模型获取最新交易。这仅用于演示,你可以使用任何你想要的模型。将 Content-Type 标头设置为 text/event-stream 以告知浏览器响应是事件流。为了使上述代码正常工作,我们需要在你的 PHP.ini 文件中启用输出缓冲。 这是通过将以下行添加到 php.ini 文件中完成的:

output_buffering=On

进行此更改后,可能需要重新加载 PHP-FPM 服务。 或者如果你使用的是 Apache,则可以重新启动 Apache。当请求 /stream 路由时,我们想调用 “stream` 方法。路由将被添加到routes/web.php 文件中,如下所示:

useAppHttpControllersStreamsController;Route::get('/stream',[StreamsController::class,'stream']);

你可以使用 Vue.js 之类的前端框架来处理事件流。 但是对于这个演示,我将使用纯 Javascript。添加到 blade 模板中的 JavaScript 片段如下所示:

consteventSource=newEventSource('/stream');eventSource.onmessage=function(event){
constdata=JSON.parse(event.data);
if(data.time){
document.getElementById('time').innerHTML=data.time;
}
constnewElement=document.createElement("li");
consteventList=document.getElementById("list");

newElement.textContent="message:"+event.data;
eventList.appendChild(newElement);}

事件流很棒且易于使用,但与 WebSockets 等其他流协议相比,它也有一些优点和缺点。例如,SSE 是单向的,这意味着一旦建立连接,服务器只会向客户端发送数据,而客户端不能将数据发送回服务器。与长轮询不同,使用 WebSockets,你只有一个与服务器的连接,类似于 SSE(服务器发送事件)。 连接是双工的,这意味着你可以从服务器发送和接收数据。关于“Laravel如何快速创建简单事件流”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: vue引入bootstrap的方法是什么

这篇“vue引入bootstrap的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue引入bootstrap的方法是什么”文章吧。1…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/05 17:08
下一篇 03/05 19:23

相关推荐