自上次我问问题以来,有多个人说将所有代码都放在此处,
安装
设置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
设置其他内容
进行活动
php artisan make:event Messages
实施应广播
class Messages implements ShouldBroadcast
将频道名称添加到broadcastOn方法
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
);
}
制定路线
转到您的app / routes / 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);
}
转到您的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>
现在,添加所有代码后,我需要一些帮助:
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事件的优先级,但它不起作用(我表示一切停止工作)
所以我的问题是:
queue:work --queue=high
时如何更改事件的优先级? (例如使用的工作示例,但我没有使用工作或监听器)感谢您的时间!