С тех пор, как в последние несколько раз я задавал вопросы, многие говорили, что поместите весь код так:
Установка
Настройка laravel echo
Перейдите в ваше приложение / resources / js / 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'
});
Также добавляем токен csrf в head:
<meta name="csrf-token" content="{{ csrf_token() }}">
Setup Redis
Перейдите в приложение / .env и измените следующую строку:
BROADCAST_DRIVER=redis
Настройка других вещей
Создать событие
php artisan make:event Messages
Реализация mustBroadcast
class Messages implements ShouldBroadcast
Добавить название канала для вещания по методу
public function broadcastOn(){
return new Private('user.' . $this->user_id);
}
Передача данных через конструктор, например:
public $data;
protected $user_id;
public function __construct($name, $message, $userid)
{
$this->user_id = (string) $userid;
$this->data = array(
'name'=> $name,
'message'=> $message
);
}
Создание маршрутов
Перейдите в приложение / маршруты /web.php и добавьте следующие строки:
Route::post('/push-message/', 'MessageController@push');
Route::get('/messages', 'HomeController@index');
Настройка контроллеров
Ваш HomeController должен иметь:
public function index() {
return view('messages');
}
Ваш MessageController должен иметь:
public function push() {
$event = new App\Events\Messages(auth()->user()->name, request('message'), request('userid'));
broadcast($event);
}
Настройка просмотра сообщений
Перейдите в свое приложение / resources / views / messages.blade.php и добавьте следующие строки:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<div id="messages">
<!-- Messages from database -->
</div>
<form id="chat">
<textarea id="message"></textarea>
<button type="submit">Send</button>
</form>
<script>
<!-- Here we are setting socket io client -->
Echo.private('user.{{auth()->user()->id}}')
.listen('Messages', (e) => {
$('#messages').append('<div class="message">'+e.data.name+': '+e.data.message+'</div>');
});
$('#chat').on('submit', function(e) {
e.preventDefault();
if($('#message').val() == "") {return false;}
$.ajax({
type: 'post',
url: '/push-message'
data: {
userid: 1, //here logged as user with id 2
message: $('#message').val(),
'_token': {{ csrf_token() }}
},
success: function(success) {
$('#messages').append('<div class="message">{{auth()->user()->name}}: '+$('#message').val()+'</div>');
$('#message').val('');
}
});
});
</script>
</body>
</html>
Сейчаспосле добавления всего кода, который я использую, мне нужна помощь:
- Если я изменяю .env
QUEUE_DRIVER
(в laravel 5.6 [не существует в 5.7 {в 5.7 есть QUEUE_CONNECTION
}]), чтобыRedis из синхронизации
Это все работает без сервера Redis, НО это немного медленно, как 3-4 секунды до получения сообщения.
Я пытался также с Redis Server и Redis-Cliна окнах, но на Redis-Cli ничего не появляется ...
Если я оставляю как SYNC, он получает сообщение через 1 секунду или мгновенно, но в Интернете все говорят, что Redis быстрее онлайн и замедляется налокальный компьютер ... Так что я хочу использовать его.
Также я попытался установить приоритет для события Сообщения с broadcast($event->onQueue('high'));
, но это не работает (Я ОЗНАЧАЮ, ЧТО ОСТАНОВЛЕНО ВСЕ ОСТАНОВЛЕНО)
Итак, мои вопросы:
- Нужен ли для этого сервер REDIS и как это сделать?правильно (как правильно его использовать)?
- Как изменить приоритет событий при запуске
queue:work --queue=high
?(пример для используемых работ, но я не использую работу или слушателей)
Спасибо за ваше время!