Подтвердить что ты не робот

Laravel Broadcast с Redis не работает/подключается?

Итак, я пытаюсь транслировать Laravel 5 Events с помощью Redis. Нет, я не хочу использовать службу, например Pusher, так как она не бесплатна (даже если для меня будет достаточно свободного ограничения), и я хочу сохранить контроль над сервером трансляции.

Итак, что я сделал до сих пор, я настроил сервер redis (прослушивая порт 6379 → по умолчанию), я установил следующее событие:

class MyEventNameHere extends Event implements ShouldBroadcast
{
    use SerializesModels;
    public $data;

    /**
     * Create a new event instance.
     *
     * @return \App\Events\MyEventNameHere
     */
    public function __construct()
    {
        $this->data = [
            'power' => 10
        ];
    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return ['pmessage'];
    }
}

Я зарегистрировал маршрут к этому событию:

Route::get('test',function()
{
    event(new App\Events\MyEventNameHere());
    return "event fired";
});

Я создал (более похоже на скопированный: P) сервер сокета node:

var app = require('http').createServer(handler);
var io = require('socket.io')(app, {origins:'*:*'});

var Redis = require('ioredis');
var redis = new Redis();

app.listen(6379, function() {
    console.log('Server is running!');
});

function handler(req, res) {
    res.writeHead(200);
    res.end('');
}

io.on('connection', function(socket) {
    console.log(socket);
});

redis.psubscribe('*', function(err, count) {
});

redis.on('pmessage', function(subscribed, channel, message) {
    console.log(message);
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
});

И я создал представление для фактического получения широковещательной передачи (testview.blade.php):

@extends('layout')
@section('content')
<p id="power">0</p>

<script>
var socket = io('http://localhost:6379');
socket.on("pmessage:App\\Events\\MyEventNameHere", function(message) {
    console.log(message);
    $('#power').text(message.data);
});
console.log(socket.connected);
</script>
@endsection

Я могу запустить сервер redis без каких-либо проблем. Я могу запустить сервер node socket.js, и я получаю ответ "Сервер работает"

Когда я нахожу маршрут к событию, я получаю "событие, вызванное событием" в моем браузере.

Когда я нахожу маршрут до фактического представления

Route::get('test/view',function()
{
    return view('testview');
});

Я вижу всю страницу (макет визуализируется), а веб-консоль не показывает никаких ошибок.

Однако, если я запускаю событие, представление не изменится, а значит, широковещательная передача не получена правильно?

Теперь я включил вывод для консоли

console.log(socket.connected);

который должен показать мне, если client подключен к socket.io вправо?

Ну, на выходе написано false. Что я здесь делаю неправильно?

Дополнительная информация о моей настройке: я запускаю весь проект на встроенном сервере php, все работает на Windows (если это когда-либо имеет значение), мой брандмауэр не блокирует ни один из портов.

РЕДАКТИРОВАТЬ 1:

Я забыл сказать, что мой сервер node также не получает сообщения... Он говорит только "Сервер работает", ничего больше.

ИЗМЕНИТЬ 2:

Я использовал еще один socket.js:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();

app.get('/', function(req, res) {
    res.sendFile(__dirname + '/index.html');
});

redis.subscribe('test-channel', function () {
    console.log('Redis: test-channel subscribed');
});

redis.on('message', function(channel, message) {
    console.log('Redis: Message on ' + channel + ' received!');
    console.log(message);
    message = JSON.parse(message);
    io.emit(channel, message.payload)
});

io.on('connection', function(socket) {
    console.log('a user connected');
    socket.on('disconnect', function() {
        console.log('user disconnected');
    });
});

http.listen(3000, function() {
    console.log('listening on *:3000');
});

И на этот раз консоль получает сообщения. Итак, если node socket.io получает сообщения, то что не так с моим клиентом? Очевидно, что сообщения транслируются правильно, единственное, что они не получают клиентом...

4b9b3361

Ответ 1

Я не могу сказать, что именно неправильно, и, вероятно, никто не может этого сделать, потому что ваша проблема связана с широким и зависящим от окружающей среды. Используя Wireshark Sniffer, вы можете легко определить часть решения, которое работает некорректно, а затем попытайтесь найти решение вокруг фактической проблемы.

Если у вас вопрос о том, как это сделать, я предлагаю не включать node на стороне сервера и использовать .NET или язык Java.

Ответ 2

Проблема с вашим кодом заключается в том, что вы подключаете свой клиентский сокет к порту по умолчанию redis 6379, а не к порту node, который равен 3000.

Итак, в вашем режиме просмотра ракурса var socket = io ('http://localhost:6379'); to var socket = io ('http://localhost:3000');

Ответ 3

Вы пытались прослушивать очередь larvel из командной строки, прежде чем запускать событие?

php artisan queue:listen