带有套接字 io 和 redis 的 laravel echo 服务器

Posted

技术标签:

【中文标题】带有套接字 io 和 redis 的 laravel echo 服务器【英文标题】:laravel echo server with socket io and redis 【发布时间】:2018-02-16 03:09:30 【问题描述】:

我尝试使用 laravel-echo 服务器和 socket.io 创建实时应用,但客户端没有变成消息

这是我的代码:

.env

BROADCAST_DRIVER=redis
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=redis

config/queue.php

 'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => 'default',
        'retry_after' => 90,
 ],

config/database.php

'redis' => [

    'retry_after' => 90,
    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

],

routes/channels.php

Broadcast::channel('messages', function() 
    return true;
); 

src/echo.js

import Echo from "laravel-echo"

window.Echo = new Echo(
   broadcaster: 'socket.io',
   host:'http://localhost:6001'
);

window.Echo.channel('messages')
  .listen('.newMessage', (message) => 
    debugger;
);

Events/MessagePosted.php

<?php

 namespace App\Events;

 use Illuminate\Broadcasting\Channel;
 use Illuminate\Queue\SerializesModels;
 use Illuminate\Foundation\Events\Dispatchable;
 use Illuminate\Broadcasting\InteractsWithSockets;
 use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class MessagePosted implements ShouldBroadcast 

 use Dispatchable, InteractsWithSockets, SerializesModels;

protected $message;

public function __construct($message)

    $this->message = $message;


public function broadcastWith()

    return [
        'message' => $this->message,
    ];


public function broadcastAs()

    return 'newMessage';


public function broadcastOn()

    return new Channel('messages');


MessageController.php

public function post(Request $request)

    event(new MessagePosted($request->get('message')));
 

Redis 服务器已安装,在 redis-cli PING 命令中返回 PONG。 我使用 php artisan queue:work redis,但是从客户端发送消息后,队列中没有显示任何内容... 客户端连接到 laravel-echo-server,它的返回: [14:04:17] - C3c8UUnTn9dvOPc9AAAA 加入频道:消息。 并处理 POST 请求

【问题讨论】:

你搞定了吗? @CatoMinor 是的,我不知道为什么,但是在我创建了新的 laravel 应用程序之后,它终于可以工作了..bitbucket.org/karpalex/student-room 在这里你可以看到使用套接字示例工作的 laravel,不确定其他逻辑,但是 larave + socket io 完美运行 谢谢!也许我也需要创建一个新的 laravel 项目。 :| 【参考方案1】:

您正在收听.newMessage,但改为发送.App.Events.MessagePosted

更改 JS 中的监听函数参数:

window.Echo.channel('messages')
  .listen('.App.Events.MessagePosted', (message) => 
  debugger;
);

【讨论】:

以上是关于带有套接字 io 和 redis 的 laravel echo 服务器的主要内容,如果未能解决你的问题,请参考以下文章

在 redis 订阅事件发生后,如何加入套接字 io 房间?

使用 Redis 扩展 Socket.IO,然后扩展 Redis 本身

带有快速会话的 ReactJS 和 socket.io - 套接字未使用正确的会话并创建了许多其他会话

node.js + socket.io + redis 架构 - 水平服务器缩放套接字连接?

Quasar Vue Socket.io Laravel-Echo 实现

使用 socket.io 连接到带有套接字的 mysql 数据库时出错