laravel 5.8 实现消息推送
以下教程是基于5.6 的,在使用5.8实现时遇到一些问题,做一下记录
在我看来,实时通信才是 APP 应用的将来。 Socket 服务通常不是那么容易实现,但是 Laravel Echo 服务改变了这个情况。
在本文中,我将会简要的介绍如何建立一个可以运行的 Socket 服务并且在这个服务上进行事件的广播。(https://github.com/tlaverdure/laravel-echo..., Laravel 的支持文档: https://learnku.com/docs/laravel/5.6/broadcasting#...)
它是完全免费的,你只要运行你自己的 Socket 服务。你也可以使用 Laravel 默认集成的 Pusher ,唯一的缺点是它是有限制的,如果超出限制则需要付费。我更喜欢自己来架构这些东西。
要求:
- Laravel 框架 (本教程使用了 5.6 版本)
- Redis 服务
- 基本的 Laravel 知识
安装 laravel-echo-server
首先我们需要全局安装 laravel-echo-server , 你只需在终端输入下面的命令。
$ npm install -g laravel-echo-server
安装完成后,打开你的 Laravel 应用,或者新启一个测试项目:
$ composer create-project --prefer-dist laravel/laravel echo-test
接下来为我们的应用安装 Predis :
$ composer require predis/predis
如果使用laradock 作为开发环境 配置.env 文件

安装完成后,切换到项目根目录下,初始化 Socket 服务:
$ laravel-echo-server init
执行这条命令后,会询问你一些关于 Socket 服务的配置信息,你可以根据自己的情况填写:
切记在生产环境中,无论你什么时候使用它,都应该关掉你的开发者模式。
我们可以尝试启动服务,看看它是否正常运行:
$ laravel-echo-server start
输出结果看起来像这样:

配置 Laravel 使 Laravel Echo Server 正常工作
打开你的 config/app.php 文件并且取消 BroadcastServiceProvider 在这个 Providers 数组中的注释:
App\Providers\BroadcastServiceProvider::class,
这个 Provider 将会启动广播路由(你或许已经在 routes/channels.php 文件里面已经看到了)
打开 .env 文件,修改 BROADCAST_DRIVER 的值为你在 laravel-echo-server 初始化时定义的值(Redis 或者 Log)。在本教程中我们将使用 Redis 驱动程序。
同时修改 QUEUE_DRIVER 为你喜欢的任何队列驱动程序,在这个示例中你可以轻松的将其更改为 Redis 驱动程序,因为你在前面已经安装并且在运行了。
接下来我们必须安装 Socket.io 客户端和 Laravel-Echo 包,你可以通过以下操作来安装:
$ npm install --save socket.io-client
$ npm install --save laravel-echo
(在运行这个之前你可能需要运行 npm install 来安装 Laravel 及相关依赖)
接下来打开 resources/assets/js/bootstrap.js 文件, 或者你自己的 引入所有 JS 基础代码的 JS 文件。
现在我们要添加启动 Echo 基础服务的代码:
import Echo from 'laravel-echo'
window.io = require('socket.io-client');
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});
现在我们准备在频道上监听消息了!我会在本教程中解释怎么开放频道,接下来开始收听我们的第一个频道:
window.Echo.channel('test-event')
.listen('ExampleEvent', (e) => {
console.log(e);
});
ps:5.8特有的'prefix'//可以选择注释掉,或者不注释,把test-event改成 {{laravel}}_database_test-event

我们通过 JS 代码告诉程序我们订阅了名为 ’test-event' 的频道,并监听 ‘ExampleEvent’ 事件 (这是事件的类名,你也可以根据你的需要自定义)。
让我们创建这个事件类:
$ php artisan make:event ExampleEvent
这将会在 App/Events 目录下面创建一个叫做 ExampleEvent.php 的事件类
让我们对这个事件类稍作调整使得它能够在我们的 Socket 服务 中能够正常运行,首先确保你的事件类继承于 ShouldBroadcast 接口,就像下面这样;
class ExampleEvent implements ShouldBroadcast
接下来向下滚动找到 broadcastOn 函数,修改它使得我们能够在正确的频道上进行广播:
public function broadcastOn()
{
return new Channel('test-event');
}
让我们在下面新建一个函数,这样我们才能有一些实例数据:
public function broadcastWith()
{
return [
'data' => 'key'
];
}
这个函数在事件被调用时调用,它将会把数据返回到你的 Socket 服务中。
现在让我们开始尝试它吧!打开你的 routes/web.php 文件并且新增一个测试路由:
Route::get('test-broadcast', function(){
broadcast(new \App\Events\ExampleEvent);
});
(有很多种方式来广播 ExampleEvent 类 ,在这个示例中我使用 Laravel 提供的 broadcast() 助手,在我看来这是最简洁的方式)
启动队列监听:
$ php artisan queue:listen --tries=1
浏览器打开一个包含 JS 文件的页面(可以是 Laravel 默认的欢迎页面),这是第一个页面,请不要关闭次页面,我们已经在此页面上订阅了 Socket 服务。
接下来打开另一个页面访问 /test-broadcast ,这将会返回一个空白页面,但是它将会通过你的 ExampleEvent 类广播到你的 Socket 服务上。返回到我们的第一个页面,打开浏览器控制台,应该可以看到类似信息:
正如你所看到的,数据通过这种形式展示在我们的客户端。你能输入任意数据通过你的 ExampleEvent 类来广播他们,这些数据可以是新闻更新,页面更新,总浏览量或者更多。
因为我们有在 laravel-echo-server 配置中有设置开发者模式,所以你能看到 Socket 服务上的所有基本信息:
现在你已经安装并运行了一个基本的 Socket 服务!但这并不是全部,你可以根据这个来做更多的事情,比如为单个用户提供认证的私有渠道。(当您想广播订单更新或私人消息时)
要做到这一点,我建议你去查看 Laravel 文档了解更多相关的内容。通过这个主题你能做很多事情,让你的应用程序变得更加神奇。你可以在这里找到相应的文档:
Broadcasting - Laravel - The PHP framework for web artisans.laravel.com
其他: 在生产环境中运行
正如我之前所说,你必须在 laravel-echo-server.json 配置文件中禁用开发者模式。 当然在服务器上你可以忽略这个文件,重新初始化它,因为你的主机可能和本地不同。
你还需要保持你的 Socket 服务在你的生产环境中运行,你可以用 Supervisor ,但是我通常使用 PM2 ,它可以方便快速的管理你的服务。 (http://pm2.keymetrics.io/)
这里是我使用 PM2 的 Socket.sh 基本配置:
#!/usr/bin/env bash
laravel-echo-server start
安装了 PM2 后, 你可以通过 pm2 start socket.sh 命令来启动脚本,运行你的 Socket 服务。
我希望它能够帮助到你。 这篇文章主要介绍的是一些基础知识,接下来我们会继续讨论广播路由的授权和不同的广播频道。
感谢你的阅读!
laravel 5.8 实现消息推送的更多相关文章
- laravel整合workerman做消息推送系统
官方建议分离 workerman和mvc框架的结合,我去,这不是有点脑缺氧吗? 大量的业务逻辑,去独立增加方法和类库在写一次,实际业务中是不现实和不实际的 gateway增加一些这方面的工作,但是我看 ...
- 实现websocket 主动消息推送,用laravel+Swoole
近来有个需求:想实现一个可以主动触发消息推送的功能,这个可以实现向模板消息那个,给予所有成员发送自定义消息,而不需要通过客户端发送消息,服务端上message中监听传送的消息进行做相对于的业务逻辑. ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- C# BS消息推送 SignalR介绍(一)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...
- iOS 之消息推送(个推)---个人小结
前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...
- WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...
- 分分钟搞定IOS远程消息推送
一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...
随机推荐
- httpwatch
https://blog.csdn.net/coderising/article/details/89530016 别人的文章
- HTML符号代码速查表
HTML实体符号被用作实现保留字符(reserved characters)或者表达键盘无法输入的一些常用字符.在大多数浏览器中默认的字符集为ISO-8859-1.HTML实体符号使我们在网页设计中经 ...
- axios 请求多个接口
axios.all([ axios.get('https://api.github.com/xxx/1'), axios.get('https://api.github.com/xxx/2') ]) ...
- 解决使用vue打包时vendor文件过大或者是app.js文件很大的问题
这篇文章主要介绍了使用vue打包时vendor文件过大或者是app.js文件很大问题的解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 第一次使用vue2.0开发,之前都是用的angu ...
- Web UI开发推荐!Kendo UI for jQuery自定义小部件——使用MVVM
Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...
- 内置对象-Math
1.随机数 Math.random() 1)获得0-1之间的随机数 2)0到100:Math.round(Math.random()*100) 2.max:求最大值 ,,,) console.log( ...
- Juit4 SpringBoot注解
@RunWith就是一个运行器 @RunWith(JUnit4.class)就是指用JUnit4来运行 @RunWith(SpringJUnit4ClassRunner.class),让测试运行于Sp ...
- qt一些函数
sleep(n); 休息ns msleep(1000); 休息1000毫秒 usleep(1000000); //休息n微妙
- cookie生命周期expires 时间过期,但是cookie没有被浏览器清理的问题
cookie生命周期expires 时间过期,但是cookie没有被浏览器清理的问题 今天用nodejs起了一个web服务,使用art-template模板引擎渲染出来的页面,在这里我设置了一个coo ...
- Prism框架中View与Region关联的几种方式
Prism.Regions命名空间下有2个重要接口:IRegionManager.IRegion IRegionManager接口中的方法与属性:AddToRegion().RegisterViewW ...