laravel5.1 广播事件broadcasting event 实现web在线实时聊天(1) 安装配置

ixibei 发表于 分类:Php / laravel 阅读(3014) 评论(0)

简介:

laravel 广播事件指的是什么呢?简单来说,最经典的例子就是实现web实时聊天。laravel 广播事件基于WebSocket protocol 是HTML5一种新的协议(低版本浏览器可能不支持)。它实现了浏览器与服务器信息实…

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"}



参考链接 

laravel事件手册

Laravel5.1 事件广播(Event Broadcasting)

Laravel事件广播


欢迎大家指出错误参加评论。以上实现了广播形式,后续还会继续跟进单点通讯,指定通讯。敬请期待!

结束语

本文有任何错误,或有任何疑问,欢迎留言说明。

本站文章除注明转载外,均为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。

http://www.onephper.com/archive/33.html

相关推荐

评论

回复给XXX取消回复

说点什么吧...

网友最新评论

输入关键字