Приоритет события во время трансляции в laravel - PullRequest
0 голосов
/ 18 октября 2018

С тех пор, как в последние несколько раз я задавал вопросы, многие говорили, что поместите весь код так:

Установка

  • Запуск npm install --save socket.io-client
  • Запустить npm install --save laravel-echo
  • Для проверки сервера laravel echo https://github.com/tlaverdure/laravel-echo-server
  • Запустить composer требуется predis / predis

Настройка 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

Настройка других вещей

  1. Создать событие

    php artisan make:event Messages

  2. Реализация mustBroadcast

    class Messages implements ShouldBroadcast

  3. Добавить название канала для вещания по методу

    public function broadcastOn(){ return new Private('user.' . $this->user_id); }

  4. Передача данных через конструктор, например:

    public $data;

    protected $user_id;

    public function __construct($name, $message, $userid) { $this->user_id = (string) $userid; $this->data = array( 'name'=> $name, 'message'=> $message ); }

  5. Создание маршрутов

Перейдите в приложение / маршруты /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'));, но это не работает (Я ОЗНАЧАЮ, ЧТО ОСТАНОВЛЕНО ВСЕ ОСТАНОВЛЕНО)

Итак, мои вопросы:

  1. Нужен ли для этого сервер REDIS и как это сделать?правильно (как правильно его использовать)?
  2. Как изменить приоритет событий при запуске queue:work --queue=high?(пример для используемых работ, но я не использую работу или слушателей)

Спасибо за ваше время!

...