无法使用 Laravel Echo、laravel-echo-server 和 socket.io 进行广播

hal*_*oei 4 php websocket socket.io laravel laravel-5

我已经使用自己的实现成功地使用 Laravel 设置了 websockets。现在我想切换到 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
Run Code Online (Sandbox Code Playgroud)

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": ""
}
Run Code Online (Sandbox Code Playgroud)

应用程序.js

import Echo from "laravel-echo"

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: 'http://192.168.134.214:6001',
});
Run Code Online (Sandbox Code Playgroud)

应用程序.blade.php

<script>
    Echo.channel('mychan')
        .listen('myevent', (e) => {
            console.log('Hello World!', e);
        });
</script>
Run Code Online (Sandbox Code Playgroud)

“NewsPublished”活动的部分内容:

class NewsPublished implements ShouldBroadcast {
    use InteractsWithSockets, SerializesModels;

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

    public function broadcastAs() {
        return 'myevent';
    }
}
Run Code Online (Sandbox Code Playgroud)

..我正在用 event(new App\Events\NewsPublished());

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

Ric*_*own 8

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

{
...
"databaseConfig": {
    "redis": {
        "port": "6379",
        "host": "localhost"
    }
...
}
Run Code Online (Sandbox Code Playgroud)

*旁白:如果您有能力使用套接字,请考虑使用 "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
}
Run Code Online (Sandbox Code Playgroud)