使用 Laravel Echo、laravel-echo-server 和 socket.io 广播将不起作用

Posted

技术标签:

【中文标题】使用 Laravel Echo、laravel-echo-server 和 socket.io 广播将不起作用【英文标题】:Broadcasting with Laravel Echo, laravel-echo-server and socket.io won't work 【发布时间】:2017-02-24 06:09:02 【问题描述】:

我已经通过自己的实现成功地使用 Laravel 设置了 websocket。现在我想切换到 Laravel Echo 和 laravel-echo-server。但是,经过数小时的尝试和阅读我能找到的所有文档后,我确实需要进一步的帮助。

当我触发事件时发生了什么:队列工作人员根据需要处理事件:“已处理:Illuminate\Broadcasting\BroadcastEvent”。但是在 laravel-echo-server 控制台和客户端都没有发生任何事情。

一些信息:

Laravel 在 8001 端口上运行

Redis 在 6379 上运行

队列工作者正在运行(php artisan queue:work)

Laravel、Redis 和 laravel-echo-server 在同一台机器上运行 (192.168.134.214)

在尝试私有通道时,BroadcastServiceProvider 中的身份验证似乎有效(如果失败,服务器会将错误写入控制台)

客户端使用 laravel-echo-server 的 socket.io 脚本:<script src="//192.168.134.214:6001/socket.io/socket.io.js"></script>

我的 .env 节选:

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

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

laravel-echo-server.json:


    "appKey": "<myAppKey>",
    "authEndpoint": "/broadcasting/auth",
    "authHost": "http://localhost:8001",
    "database": "redis",
    "databaseConfig": 
        "redis": 
            "port": "6379",
            "host": "http://localhost"
        
    ,
    "devMode": true,
    "host": "192.168.134.214",
    "port": "6001",
    "sslCertPath": "",
    "sslKeyPath": ""

app.js

import Echo from "laravel-echo"

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

app.blade.php

<script>
    Echo.channel('mychan')
        .listen('myevent', (e) => 
            console.log('Hello World!', e);
        );
</script>

部分事件“NewsPublished”:

class NewsPublished implements ShouldBroadcast 
    use InteractsWithSockets, SerializesModels;

    public function broadcastOn() 
        return new Channel('mychan');
    

    public function broadcastAs() 
        return 'myevent';
    

..我正在使用event(new App\Events\NewsPublished()); 触发事件

我希望在将“devMode”切换为 true 时从 laravel-echo-server 中获取一些信息。但这似乎并没有改变任何东西!

【问题讨论】:

我怀疑这是否是问题所在,但php artisan queue:work 不会启动队列工作人员侦听作业的进程——它只是处理队列中的下一个作业然后退出。我想你正在寻找php artisan queue:listen 【参考方案1】:

在您的 redis 配置中,您已将 http:// 作为与主机的协议。您将需要删除协议并简单地使用 localhost127.0.0.1


...
"databaseConfig": 
    "redis": 
        "port": "6379",
        "host": "localhost"
    
...

*旁白:如果您有能力使用套接字,请考虑使用“path”:“/path/to/sockfile”代替“host”;这更关乎性能,但我相信这个更正应该让它发挥作用。

作为参考,这是我正在使用的 laravel-echo-server.json 配置的修订版本。


  "appKey": [omitted],
  "authEndpoint": "/broadcasting/auth",
  "authHost": "http://localhost",
  "database": "redis",
  "databaseConfig": 
    "redis": 
      "db": 2, /*this is an intentional change; the default is zero(0)*/
      "path": "/tmp/redis.sock",
      "password": [omitted]
    
  ,
  "devMode": false,
  "host": "",
  "port": "6001",
  "referrers": [
    
      "host": "*", /*matches any referrer*/
      "apiKey": [omitted]
    
  ],
  "sslCertPath": "",
  "sslKeyPath": "",
  "verifyAuthPath": true,
  "verifyAuthServer": false

【讨论】:

太棒了!在 unix 套接字上运行 redis 并在 laravel-echo-server 中配置它就可以了。非常感谢!

以上是关于使用 Laravel Echo、laravel-echo-server 和 socket.io 广播将不起作用的主要内容,如果未能解决你的问题,请参考以下文章

laravel-s实现高性能webSocket服务

在 laravel elixir 上使用多个 webpack 方法

使用 Laravel Echo、laravel-echo-server 和 socket.io 广播将不起作用

在 Laravel 中使用 echo 查看输出消息

Laravel框架中Echo的使用过程

Laravel 事件广播没有被拾取 laravel-echo-server