laravel 广播事件指的是什么呢?简单来说,最经典的例子就是实现web实时聊天。laravel 广播事件基于WebSocket protocol 是HTML5一种新的协议(低版本浏览器可能不支持)。它实现了浏览器与服务器信息实时传递,通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP长连接。相对于传统的ajax轮询,这种方式不仅减少了代码工作量,更加使服务器效率大大增加!websocket简介。下面就让我们来安装配置实现这个laravel功能。
一、准备工作
1.1 laravel 5.1
1.2 node.js
1.2.1 基于nodejs的 ioredis,socket.io 插件 分别是链接ioredis 和搭建websocket
1.3 redis 使用redis作为php和js的通信方式
二、配置laravel
2.1 config/broadcasting.php中,如下配置'default' => env('BROADCAST_DRIVER', 'redis')
2.2 config/database.php 中配置好redis的连接。该广播操作底层借助了 redis 的订阅和发布机制
2.3 定义一个被广播的事件
2.3.1 在 app\Providers\EventServiceProvider 默认已经写好了一个protected $listen 和一个公共方法boot 这个我们不用去管他,使用命令
php artisan event:generate
2.3.2 执行完此命令 你可以发现 app\Events 多了一个 SomeEvent.php app\Listeners 多了一个EventListener.php
2.3.3 根据Laravel文档的说明,想让事件被广播,必须让Event类实现一个Illuminate\Contracts\Broadcasting\ShouldBroadcast接口,并且实现一个方法broadcastOn。broadcastOn返回一个数组,包含了事件发送到的channel(频道)。如下:
<?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class SomeEvent extends Event implements ShouldBroadcast { use SerializesModels; public $user_id; public $name; /** * Create a new event instance. * * @return void */ public function __construct($user_id) { $this->user_id = $user_id; $this->name = 'xu'; } /** * Get the channels the event should be broadcast on. * * @return array */ public function broadcastOn() { return ['test-channel']; } }
2.3.4 默认来说 声明的public属性都会被序列化后发送 也可以使用 broadcastWith方法指定要发送的数据 例如
/** * 获取广播数据。 * * @return array */ public function broadcastWith() { return [ 'user' => $this->user_id, 'name' => 'aaaa', ]; }
三、配置安装 nodejs 并且下载 socket.io ioredis 插件到 laravel 项目中
3.1 一直比较坑我的就是 nodejs 我使用的是virtualbox centos6.8 每次装这个东西总会出现点问题,建议不要编译安装,会出现以下乱起八糟的东西。二进制方法比较简单暴力
3.2 node.js 官网下载列表 我的机器是32 位 我就下载了32 位二进制包 当然还有64位 注意自己的系统
3.3 下载好node.js 后解压到自己相关的安装目录 然后在 /etc/profile 中写如以下命令
export NODE_HOME=/usr/local/node/ export PATH=$PATH:$NODE_HOME/bin export NODE_PATH=$NODE_HOME/lib/
3.4 以上注意你解压的路径,要对应正确 我是放在了 /usr/local/node 里。搞定之后使用命令 source /etc/profile
3.5 此时你使用 node -v 应该可以看到当前node的版本了
3.6 切换到你项目目录 安装 socket.io ioredis
npm install ioredis socket.io --save
3.7 安装完成后你的 项目根目录应该会多出 node_modules 文件夹 此文件夹里面包含了 ioredis socket.io两个文件夹 看到这里就代表你已经安装成功
四 、配置websocket服务器
4.1 在根目录 新建一个socket.js 代码如下
var app = require('http').createServer(handler); var io = require('socket.io')(app); var Redis = require('ioredis'); var redis = new Redis('6379','192.168.0.218'); app.listen(3000, function() { console.log('Server is running! Listening on Port 3000'); }); function handler(req, res) { res.writeHead(200); res.end(''); } io.on('connection', function(socket) { // }); redis.psubscribe('*', function(err, count) { // }); redis.on('pmessage', function(subscribed, channel, message) { message = JSON.parse(message); io.emit(channel + ':' + message.event, message.data); });
4.2 这里监听的是3000 端口,你也可以更新为其他没有占用的端口,如果配置了防火墙一定要记住开放此端口,我就被坑了几个小时
4.3 开启监听 node socket.js 执行此命令后你应该可以看到命令行中出现
Server is running! Listening on Port 3000
五、模板(客户端)中加入代码 与服务器 websocket 进行连接
5.1 将在 node_modules/socket.io 复制一份到 public/js 目录一份
5.2 在模版中加入(通过www.op.com可以访问该模板)
<script src="js/socket.io/node_modules/socket.io-client/socket.io.js"></script> <script> var socket = io('http://www.op.com:3000'); socket.on('connection', function (data) { console.log(data); }); socket.on('test-channel:App\\Events\\SomeEvent', function(message){ console.log(message); }); console.log(socket); </script>
5.2.1 这里可以看到 js 代码中的 App\\Events\\SomeEvent 指的就是laravel 框架中的SomeEvent路径,我们也可以改个名字,只需要在SomeEvent中增加broadcastAs方法
public function broadcastAs() { return 'op'; }
5.2.2 这样上面的js可以更新为
socket.on('test-channel:op', function(message){ console.log(message); });
5.3 在route中简单的定义个触发事件
Route::get('/event', function(){ Event::fire(new \App\Events\SomeEvent(555)); return "hello world"; });
5.4 打开www.op.com并打开控制台,在开一个标签打开www.op.com/event 如果在www.op.com这个控制台中打印出如下代码,则代表安装配置成功。
Object {user: 555, name: "aaaa"}
参考链接
Laravel5.1 事件广播(Event Broadcasting)
欢迎大家指出错误参加评论。以上实现了广播形式,后续还会继续跟进单点通讯,指定通讯。敬请期待!
结束语
本文有任何错误,或有任何疑问,欢迎留言说明。
网友最新评论