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.
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前

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