借助Laravel Broadcasting你可以使用上时下很热的Websocket技术。
注意:请务必使用较新版本的 Laravel。Laravel在最近几个版本进行过比较大的重构,比如路由从 app\Http\routes.php 拆分为到 routes 目录下的多个文件,包括广播在内的各个附加组件也都进行了重构并正式写入文档。所以网上有些教程(特别是入门教程)可能是根据旧版本来写的,容易让你迷惑。当安装完Laravel后执行以下命令查看Laravel版本
php artisan --version
如果低于 5.4 请重新建立新版本的Laravel,具体方法在下面会详细讲解。
实例背景:
假设场景:
假设我们要使用laravel作为服务端做一个新闻推送系统。用户打开页面后不需要刷新页面即可不断的获取到最新的新闻。
环境参数
- Homestead 7.4.2
- Laravel 5.6.23 (广播机制在 5.4 以后进行了一次重构,并正式加入文档,所以请务必使用 5.4 及其以上版本)
- PHP 7.1
- Redis 4.0.9 (Homestead 自带redis)
建立基本项目框架
使用laravel new 来建立 quickstart 项目
laravel new quickstart
我安装完后的laravel版本为5.6.23
$ php artisan --version
Laravel Framework version 5.6.23
编辑 .env 文件,修改 APP_URL=http://quickstart
APP_URL=http://quickstart
我们还需要做3件事情才能让quickstart成功的被部署:
1. 在 hosts 文件中增加 quickstart 到 192.168.10.10 (vagrant地址)的域名解析
192.168.10.10 quickstart
2. 编辑Homestead.yaml增加 quickstart 这个网站
- map: quickstart
to: /home/vagrant/Code/quickstart/public
php: "7.1"
3 reload vagrant 虚拟机
cd ~/Homestead
vagrant reload --provision
最后,打开浏览器访问 http://quickstart 你将会看到如下页面
说明项目搭建成功。接下来我们在这个quickstart的基础上为项目添加广播机制。
广播架构
目前有两种广播机制可选:
- pusher:laravel自带方案,但是有使用限制,需要收费
- Redis + socket.io:无限制
接下来你会信息爆炸似的接收到好几个新名词:
- laravel-echo-server:使用 socket.io 机制实现的 broadcasting 服务端
- laravel-echo:laravel-echo是 laravel broadcasting 的客户端。注意,laravel-echo 并不是 laravel-echo-server 专属的客户端, laravel-echo 有两种连接机制可以选:pusher 和 socket.io 。 而 laravel-echo-server 是开发出来专门用于 socket.io连接的服务端。如果你使用的是 pusher,那么不需要使用 laravel-echo-server ,但是你依然要使用 laravel-echo
- Socket.IO:websocket 的一种nodejs实现。laravel-echo 如果要使用socket.io 则需要先安装 socket.io-client。
- Predis:redis客户端的php实现,如果要使用redis作为广播机制的实现,则需要先安装 predis
- Laravel Event:广播事件类
- Laravel Queue:广播机制是基于queue机制来实现的
- Redis Sub/Pub:Redis的订阅机制。laravel-echo-server本质上只是一个Redis订阅服务的订阅者。
这几样东西配合起来的架构图如下
根据这幅图我们可以知道事件的广播机制流程:
- Laravel 通过 broadcasting 机制发布一个Event对象到Redis
- Laravel Queue Worker 读取该Event对象,并使用Redis的Sub/Pub机制将该 Event对象发布出去
- laravel-echo-server 通过 Redis 的 Sub/Pub机制收听到该 Event
- 由于 laravel-echo 使用 socket.io 跟 laravel-echo-server相连接。所以 laravel-echo 会通过socket.io将Event对象发送给laravel-echo
- laravel-echo解析通过 socket.io接收到的 Event对象
广播事件种类:
- public:谁都可以收听的广播