文章转发自专业的Laravel开发者社区,原文链接:https://learnku.com/laravel/t...在我看来,真正-时间通讯是APP应用的未来。套接字服务通常不是那么容易实现,但LaravelEcho服务改变了这一点。在这篇文章中,我将简要介绍如何建立一个正在运行的Socket服务,并在该服务上广播事件。(https://github.com/tlaverdure...)它是完全免费的,你只需要运行你自己的Socket服务。你也可以使用Laravel默认集成的Pusher。唯一的缺点就是有上限,超过上限就需要付费。我更喜欢自己设计这些东西。需求:Laravel框架(本教程使用5.6版本)Redis服务Laravel基础知识安装laravel-echo-server首先我们需要全局安装laravel-echo-server,只需要在终端输入以下命令即可。$npminstall-glaravel-echo-server安装完成后,打开你的Laravel应用程序,或者开始一个新的测试项目:$composercreate-project--prefer-distlaravel/laravelecho-test接下来,为我们的应用程序安装Predis:$composerrequirepredis/predis安装完成后,切换到项目根目录,初始化Socket服务:$laravel-echo-serverinit执行该命令后,会询问Socket服务的一些配置信息.你可以按照自己的情况填写:记住,在生产环境中,无论什么时候使用,你都应该关闭你的开发者模式。我们可以尝试启动该服务并查看它是否工作:$laravel-echo-serverstart输出如下所示:配置Laravel使LaravelEchoServer工作打开您的config/app.php文件并取消选中ProvidersNotes中的BroadcastServiceProvider数组中:AppProvidersBroadcastServiceProvider::class,这个Provider会启动广播路由(你可能在routes/channels.php文件中看到过)打开.env文件,修改BROADCAST_DRIVER的值为你的laravel-echo-server的值在初始化期间定义(Redis或Log)。在本教程中,我们将使用Redis驱动程序。还要将QUEUE_DRIVER更改为您喜欢的任何队列驱动程序,在此示例中,您可以轻松地将其更改为Redis驱动程序,因为您之前已启动并运行它。接下来我们必须安装Socket.io客户端和Laravel-Echo包,你可以这样做:$npminstall--savesocket.io-client$npminstall--savelaravel-echo需要运行npminstall来安装Laravel和相关依赖)接下来,打开resources/assets/js/bootstrap.js文件,或者你自己的导入所有JS基础代码的JS文件。现在我们需要添加代码来启动Echo基础服务:importEchofrom'laravel-echo'window.io=require('socket.io-client');window.Echo=newEcho({broadcaster:'socket.io',host:window.location.hostname+':6001'});现在我们准备好在频道上收听消息了!我将在本教程中解释如何打开频道,让我们开始收听我们的第一个频道:window.Echo.channel('test-event').listen('ExampleEvent',(e)=>{console.log(e);});我们通过JS代码告诉程序我们已经订阅了名为'test-event'的频道,监听'ExampleEvent'事件(这个是事件的类名,你也可以根据需要自定义).让我们创建这个事件类:$phpartisanmake:eventExampleEvent这将在App/Events目录中创建一个名为ExampleEvent.php的事件类让我们调整这个事件类,以便它可以在我们的Socket服务中正常运行,首先使确保您的事件类继承自ShouldBroadcast接口,如下所示;classExampleEventimplementsShouldBroadcast然后向下滚动找到broadcastOn函数,修改它以便我们可以在正确的频道上广播:publicfunctionbroadcastOn(){returnnewChannel('test-event');}让我们在下面创建一个新函数我们可以有一些实例数据:publicfunctionbroadcastWith(){return['data'=>'key'];}这个函数在事件被调用时被调用,它会将数据返回给你的Socket服务。让我们现在开始尝试吧!打开你的routes/web.php文件并添加一个测试路由:Route::get('test-broadcast',function(){broadcast(new\App\Events\ExampleEvent);});(广播ExampleEvent类的方式有很多种,本例中我使用了Laravel提供的broadcast()helper,这是我认为最简洁的方式)启动队列监听:$phpartisanqueue:listen--tries=1浏览器打开一个包含JS文件的浏览器页面(可以是Laravel默认的欢迎页面),这是第一个页面,请不要关闭第二个页面,我们已经在这个页面订阅了Socket服务。接下来,打开另一个页面并访问/test-broadcast,这将返回一个空白页面,但它将通过您的ExampleEvent类广播到您的Socket服务。回到我们的第一个页面,打开浏览器控制台,应该会看到类似的信息:可以看到,数据是以这种形式显示在我们的客户端上的。您可以通过ExampleEvent类输入任意数据来广播它们,这些数据可以是新闻更新、页面更新、总页面浏览量或更多。由于我们在laravel-echo-server配置中设置了开发者模式,您可以看到有关Socket服务的所有基本信息:您现在已经启动并运行了一个基本的Socket服务!但这还不是全部,你还可以基于此做更多的事情,比如为单个用户提供一个私有的认证通道。(当你想广播订单更新或私人消息时)为此,我建议你查看Laravel文档以获取更多信息。您可以使用此主题做很多事情,使您的应用程序更加出色。你可以在这里找到相应的文档:Broadcasting-Laravel-ThePHPframeworkforwebartisans.laravel.comMiscellaneous:RunninginProduction正如我之前所说,你必须在laravel-echo-server.json配置文件中禁用开发者模式。当然,你可以忽略服务器上的这个文件,重新初始化,因为你的主机可能和本地的不一样。你还需要让你的Socket服务在你的生产环境中保持运行,你可以使用Supervisor,但我通常使用PM2,它可以方便快捷地管理你的服务。(http://pm2.keymetrics.io/)这是我使用PM2的基本Socket.sh配置:#!/usr/bin/envbashlaravel-echo-serverstart安装PM2后,您可以通过pm2启动套接字。sh命令启动脚本并运行您的Socket服务。我希望它可以帮助你。这篇文章主要介绍一些基础知识,接下来我们会继续讨论广播路由的授权和不同的广播频道。谢谢阅读!
