Итак, я настроил Redis, Socket.io и Laravel Echo.
Это мой .env:
BROADCAST_DRIVER=redis
QUEUE_DRIVER=redis
REDIS_HOST=acl.test
REDIS_PASSWORD=null
REDIS_PORT=3001
Я создал событие под названием CreatedEcall:
class CreatedEcall implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
$this->data = "test";
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new Channel('testChannel');
}
public function broadcastAs()
{
return 'ecall.created';
}
}
Сервер Socket.io работает на порту 6001 с использованием следующего кода:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('testChannel', function(err, count) {
});
redis.on('message', function(channel, message) {
console.log('Message received: ' + message);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
http.listen(6001, function(){
console.log('Listening on Port 6001');
});
Кроме того, сервер Redis работает на порту 3001.
26696:M 24 Apr 12:28:59.473 * Ready to accept connections
Теперь я построил простой маршрут, который запускает событие, используя event(new \App\Events\CreatedEcall());
При запуске работника очереди (redis) с помощью php artisan queue:work
событие получено правильно [2018-04-24 14:29:19] Processed: Illuminate\Broadcasting\BroadcastEvent
но мой веб-сокет ничего не выводит на консоль и, по-видимому, в соответствии с инструментами Chrome Dev веб-сокет ничего не делает, кроме как инициирует код состояния 101 (протоколы переключения).
Я включил поставщика услуг, раскомментировав App\Providers\BroadcastServiceProvider::class,
в файле config / app.php.
Это мой эхо-файл Javascript:
import Echo from "laravel-echo"
if (typeof io !== 'undefined') {
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});
window.Echo.channel('testChannel')
.listen('.ecall.created', (e) => {
console.log(e);
});
}
Что я упускаю или делаю неправильно?
Задача ещё не решена.
Других решений пока нет …