Laravel-echo-server 加入不了频道

问题

按照 广播系统 配置后,队列启动正常,laravel-echo-server start正常,事件触发后,laravel-echo-server也有日志,但是前端页面没有加入频道,导致消息不能接收。

环境

  • Windows
  • Laravel Framework 7.30.0
  • PHP 7.2.31
  • Redis 3.2.100
  • Laravel echo server 1.6.2

配置

.env

...
BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
...

app.php

...
'providers'=>[
    App\Providers\BroadcastServiceProvider::class,
]
...

queue.php

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

database.php

...
'redis' => [

  'client' => env('REDIS_CLIENT', 'predis'),

  'options' => [
      'cluster' => env('REDIS_CLUSTER', 'redis'),
      'prefix' => '',
  ],

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

  'cache' => [
      'url' => env('REDIS_URL'),
      'host' => env('REDIS_HOST', '127.0.0.1'),
      'password' => env('REDIS_PASSWORD', null),
      'port' => env('REDIS_PORT', 6379),
      'database' => env('REDIS_CACHE_DB', 1),
    ],
],
...

broadcasting.php

...
'default' => env('BROADCAST_DRIVER', 'null'),
...
'redis' => [
  'driver' => 'redis',
  'connection' => 'default',
],
...

laravel-echo-server.json

{
  "authHost": "http://www.hawaii.local/",
  "authEndpoint": "/broadcasting/auth",
  "clients": [],
  "database": "redis",
  "databaseConfig": {
    "redis": {},
    "sqlite": {
      "databasePath": "/database/laravel-echo-server.sqlite"
    }
  },
  "devMode": true,
  "host": null,
  "port": "6001",
  "protocol": "http",
  "socketio": {},
  "secureOptions": 67108864,
  "sslCertPath": "",
  "sslKeyPath": "",
  "sslCertChainPath": "",
  "sslPassphrase": "",
  "subscribers": {
    "http": true,
    "redis": true
  },
  "apiOriginAllow": {
    "allowCors": false,
    "allowOrigin": "",
    "allowMethods": "",
    "allowHeaders": ""
  }
}

事件

ExampleEvent.php

<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class ExampleEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('test-event');
    }
    public function broadcastWith()
    {
        return [
            'time' => time(),
        ];
    }
}

前端页面

bootstrap.js

import Echo from "laravel-echo"

window.io = require('socket.io-client');

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});

app.js

require('./bootstrap');
...
const app = new Vue({
  el: '#app',
  mounted() {
    this.echo();
  },
  methods: {
    echo() {
      console.log(123456);
      window.Echo.channel('test-event').listen('ExampleEvent', (e) => {
    console.log(e);
  });
});

队列截图

Laravel-echo-server 加入不了频道

laravel-echo-server 截图

Laravel-echo-server 加入不了频道

Network截图

Laravel-echo-server 加入不了频道

补充

我是按照 这篇文章 操作的,其中的截图
可以很清楚地看到 xxx joined channel: test-event,但是我这边只有事件触发的日志,没有用户加入频道的日志输出。

Be the one you want to be.
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

解决方案

bootstrap.js

import Echo from 'laravel-echo';
// window.io = require('socket.io-client');
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});

xxx.blade.php

<script src="https://cdn.bootcdn.net/ajax/libs/socket.io/2.3.0/socket.io.js"></script>

注释掉编译引用的 socket.io ,使用 socket.io.js 即可

3年前 评论
未定义 (作者) (楼主) 3年前
yuppie_php 2年前
barret 3年前
未定义 (作者) (楼主) 3年前
hesinnm 3年前
未定义 (作者) (楼主) 3年前
Woods 3年前
barret 3年前
wgn-laravel 3年前
讨论数量: 17

项目配置虚拟域名,laravel-echo-server.jsonauthHost 需要同虚拟域名一致,前端打开开发者工具,设置正确的话如图

file

会提示 [sid] joined channel: YouChannel

3年前 评论
未定义 (楼主) 3年前

解决方案

bootstrap.js

import Echo from 'laravel-echo';
// window.io = require('socket.io-client');
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});

xxx.blade.php

<script src="https://cdn.bootcdn.net/ajax/libs/socket.io/2.3.0/socket.io.js"></script>

注释掉编译引用的 socket.io ,使用 socket.io.js 即可

3年前 评论
未定义 (作者) (楼主) 3年前
yuppie_php 2年前
barret 3年前
未定义 (作者) (楼主) 3年前
hesinnm 3年前
未定义 (作者) (楼主) 3年前
Woods 3年前
barret 3年前
wgn-laravel 3年前

请问下 我尝试使用私人频道 但是请求验证403


3年前 评论
未定义 (楼主) 3年前
1719 (作者) 3年前
1719 (作者) 3年前
need_Help 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!