laravel订阅/即时消息redis

阿亮_乐享工作室 · · 559 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

准备工作

laravel5.1框架
redis插件
nodejs安装

安装redis插件

Laravel 5.1中 Redis 的安装配置及基本使用教程

composer require predis/predis 1.0.*

注意:本地win记得打开server.exe端

config/broadcasting.php中,如下配置'default' => env('BROADCAST_DRIVER', 'redis'),,使用redis作为php和js的通信方式。
config/database.php中配置redis的连接。

Paste_Image.png
Paste_Image.png

Paste_Image.png
Paste_Image.png
编写事件
php artisan make:event SomeEvent

根据Laravel文档的说明,想让事件被广播,必须让Event类实现一个Illuminate\Contracts\Broadcasting\ShouldBroadcast接口,并且实现一个方法broadcastOn。broadcastOn返回一个数组,包含了事件发送到的channel(频道)。如下:

    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;

        /**
         * Create a new event instance.
         *
         * @return void
         */
        public function __construct($user_id)
        {
            $this->user_id = $user_id;
        }

        /**
         * Get the channels the event should be broadcast on.
         *
         * @return array
         */
        public function broadcastOn()
        {
            return ['test-channel'];
        }
    }

被广播的数据默认情况下,Event中的所有public属性都会被序列化后广播。上面的例子中就是$user_id这个属性。你也可以使用broadcastWith这个方法,明确的指出要广播什么数据。例如:

    public function broadcastWith()
    {
        return ['user_id' => $this->user_id];
    }

创建监听

php artisan event:generate
Paste_Image.png
Paste_Image.png
nodejs创建项目

node下载
Cannot find module 'socket.io'
NPM 使用介绍

Paste_Image.png
Paste_Image.png

切换到自定义的nodejs目录,cmd运行命令 安装依赖

npm install socket.io
npm installioredis
...
Paste_Image.png
Paste_Image.png
创建文件io.js
    var app = require('http').createServer(handler);
    var io = require('socket.io')(app);

    var Redis = require('ioredis');
    var redis = new Redis('6379', '192.168.12.225');//注意本地ip
    //连接redis服务器

    //监听客户端端口 这里是 6001
    app.listen(6001, function () {
        console.log('Server is running!');
    });

    function handler(req, res) {
        res.writeHead(200);
        res.end('');
    }

    io.on('connection', function (socket) {
        console.log('connected');
    });

    redis.psubscribe('*', function (err, count) {
        console.log(count);
    });

    redis.on('pmessage', function (subscribed, channel, message) {
        console.log(subscribed);
        console.log(channel);
        console.log(message);

        //发送到客户端的数据
        message = JSON.parse(message);
        io.emit(channel + ':' + message.event, message.data);
    });
运行js监听io.js
node io.js
前端客户端代码
    <!DOCTYPE html>
    <head>
        <title>Pusher Test</title>
        <script src="NodeJs/js/socket.io.js"></script>

        <script>
            var socket = io('http://localhost:6001');
            socket.on('connection', function (data) {
                console.log(data);
            });
            socket.on('test-channel:App\\Events\\SomeEvent', function (message) {
                console.log(message);
            });
        </script>
    <body>
    测试
    </body>
    </head>

其中socket.io.js文件在node_modules文件夹下的库文件中获取

触发事件
 event(new SomeEvent(1));
 或
 Event::fire(new \App\Events\SomeEvent(2));
参考文献

[ Laravel 5.1 文档 ] 服务 —— 事件
Laravel5.1 事件广播(Event Broadcasting)
Cannot find module 'socket.io'
NPM 使用介绍

本文来自:简书

感谢作者:阿亮_乐享工作室

查看原文:laravel订阅/即时消息redis

559 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet