Laravel Echo Server, Redis, Socket.IO: не могу заставить их работать

Я разрабатываю приложение в реальном времени с Laravel. Поскольку я не хочу использовать Pusher, я пытаюсь заставить работать веб-сокеты с помощью Laravel Echo Server , Redis и Socket.IO. Однако у меня проблема с этим стеком. Клиент (браузер) не может получать данные из событий. Я также использую Intertia и Vue для интерфейса. Также стоит отметить, что я использую Laragon в качестве локальной среды разработки.

Мои .env, некоторые опущены:

APP_URL=http://malbe.test

BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=redis
SESSION_DRIVER=file
SESSION_LIFETIME=120

MIX_APP_URL = "${APP_URL}"

Мой laravel-echo-server.json:

{
    "authHost": "http://malbe.test",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "omitted",
            "key": "omitted"
        }
    ],
    "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": true,
        "allowOrigin": "http://malbe.test:80",
        "allowMethods": "GET, POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

Моя конфигурация Redis на database.php: Примечание. Я использую predis, потому что я не могу заставить phpredis работать, даже если я установил dll для расширений PHP.

'redis' => [

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

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            // 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
            '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'),
        ],

    ],

Мое событие Laravel:

class SampleEvent implements ShouldBroadcast {
   use Dispatchable, InteractsWithSockets, SerializesModels;

   public function __construct()
   {
       //
   }

   public function broadcastOn() {
      return new Channel("my-channel");
   }

   public function broadcastWith() {
      return ["data"=>"Hello"];
   }
}

Инициализация моего эха в bootstrap.js:

import Echo from "laravel-echo";
window.io = require("socket.io-client");

if (typeof window.io !== "undefined") {
    window.Echo = new Echo({
        broadcaster: "socket.io",
        host: process.env.MIX_APP_URL + ":6001"
    });
}

На странице Vue, которая подписывается на сервер Echo

export default {
    props: ["foo"],
    mounted: function () {
        window.Echo.channel("my-channel").listen("SampleEvent", (d) => console.info(d));
    }
};

С этими 3 запущенными командами:

  1. laravel-echo-server start
  2. npm run watch
  3. php artisan queue:work

Я попытался транслировать событие, используя запрос Tinker и GET.

Route::get("/broadcast", function () {
    event(new \App\Events\SampleEvent);
    // also tried
    // broadcast(new \App\Events\SampleEvent);
});

Обработчик очереди обрабатывает события;

[2020-12-24 11:07:35][n9FKq0n6C6QOKa2f1JBzWcCqgYqLiDvU] Processing: App\Events\SampleEvent
[2020-12-24 11:07:35][n9FKq0n6C6QOKa2f1JBzWcCqgYqLiDvU] Processed:  App\Events\SampleEvent

И laravel-echo-server выводит это всякий раз, когда транслируется событие;

L A R A V E L  E C H O  S E R V E R  
                                     
version 1.6.2                        
                                     
⚠ Starting server in DEV mode...     
                                     
✔  Running at localhost on port 6001 
✔  Channels are ready.               
✔  Listening for http events...      
✔  Listening for redis events...     
                                     
Server ready!                        
                                 
Channel: my-channel                  
Event: App\Events\SampleEvent        

Клиент не показывает никаких ошибок. Вот посмотрите на его вкладку «Сеть» в консоли разработчика:

Вкладка «Сеть в браузере»

И когда я закрыл laravel-echo-server, когда клиент все еще открыт, эта ошибка возникает каждую секунду:

ERR_CONNECTION_REFUSED

Извините за длинный вопрос, мне просто нужно было показать всю свою конфигурацию, чтобы я мог помочь вам помочь мне с этой проблемой. Может ли кто-нибудь указать мне правильное решение? Спасибо!

у меня точно такая же проблема

Geeks 15.01.2021 13:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
1
8 383
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, что ваш код конфигурации правильный. Вы можете увидеть свою конфигурацию package.json в vue:

"socket.io-client": "^2.4.0",

Если ваш "socket.io-client" — это >=3, вам лучше заменить его на 2.4.0. и запустите:

sudo cnpm i [email protected]

Я потратил две недели на этот вопрос... большое спасибо! это из-за требуемого безопасного соединения?

Darkshifty 08.02.2021 18:07

В моем случае последняя версия engine.io вообще не работала с Laravel. Вы можете определить это по параметру EIO в URL-адресе. После того, как я перешел на версию клиента 2.4, параметр EIO изменился с 4 на 3, и все заработало, как и ожидалось.

hammurabi 13.02.2021 23:10

СПАСИБО! Я потратил слишком много часов, пытаясь разобраться в этом.

Martin Sheeks 28.08.2021 21:50
npm install [email protected] или используйте npm i [email protected] для установки
Harsh Patel 18.01.2022 12:28

@Token-Yan У меня есть сомнения, почему он не работает с последней версией socket.io-client v4.4.1. Сначала я установил последнюю версию, но она не работает, затем я вижу ваш ответ и попробовал с socket.io-client v2.4.0, после чего он отлично работает. какова точная причина, вы можете мне объяснить?

Harsh Patel 18.01.2022 12:36

У меня такая же проблема в React Native, но вы спасли меня от разочарования, с которым я боролся уже более недели.

Paulos Ab 11.01.2023 22:54

Echo не поддерживает и не планирует поддерживать Socket IO >= v3 больше информации здесь: https://github.com/laravel/echo/issues/290

Другие вопросы по теме