这篇文章主要介绍“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的方法是什么”文章吧。1…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。