在laravel中广播时优先考虑活动

时间:2018-10-18 16:51:43

标签: php laravel redis socket.io laravel-echo

自上次我问问题以来,有多个人说将所有代码都放在此处,

安装

设置laravel echo

转到您的app / 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令牌:

<meta name="csrf-token" content="{{ csrf_token() }}">

设置Redis

转到您的app / .env并更改以下行:

BROADCAST_DRIVER=redis

设置其他内容

  1. 进行活动

    php artisan make:event Messages

  2. 实施应广播

    class Messages implements ShouldBroadcast

  3. 将频道名称添加到broadcastOn方法

    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. 制定路线

转到您的app / routes / web.php并添加以下行:

Route::post('/push-message/', 'MessageController@push');
Route::get('/messages', 'HomeController@index');
  1. 设置控制器

您的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);
}
  1. 设置消息视图

转到您的app / 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秒。

我也在Windows上使用redis服务器和redis-cli进行了尝试,但是在redis-cli上却什么也没有出现...

  • 如果我以SYNC的身份离开,它会在1秒钟内或立即收到消息,但是在网络上,每个人都说redis在线速度更快,而在本地计算机上速度较慢...所以我想使用它。 li>

  • 我也尝试使用broadcast($event->onQueue('high'));设置Messages事件的优先级,但它不起作用(我表示一切停止工作)

所以我的问题是:

  1. 我需要REDIS服务器吗?如何正确使用它(如何正确使用)?
  2. 运行queue:work --queue=high时如何更改事件的优先级? (例如使用的工作示例,但我没有使用工作或监听器)

感谢您的时间!

0 个答案:

没有答案