Я использую Laravel и Redis для чата в реальном времени. Я могу запустить событие из моего laravel и получать эти данные на стороне клиента.
Моя проблема в том, как я могу отправить что-то от клиента, а затем получить его на Redis и передать Laravel
Например, как я могу проверить, прочитал ли пользователь сообщение в чате.
Код:
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require( 'socket.io' ).listen( server );
var redis = require('redis');
var port = process.env.PORT || 8888;
server.listen(port,'x.x.x.x');
io.on('connection', function (socket) {
console.log("Connected");
});
var redisClient = redis.createClient();
redisClient.psubscribe(['get_message','read_message']);
redisClient.on("pmessage", function(channel, pattern, message) {
console.log(channel); // i can see get_message on this line in console but not read_message
});
//Also tried this
io.on('read_message', function (socket) {
console.log(socket);
});
//Also this
redisClient.on('read_message', function (socket) {
console.log(socket);
});
redisClient.on('disconnect', function() {
console.log("Disconnected");
redisClient.quit();
});
Примечание. Я отправляю данные из приложения IOS.
Redis — это механизм хранения ключей / значений. Вы должны относиться к этому как к базе данных.
Клиент отправляет запрос веб-серверу, который получает этот запрос, и решает, что с ним делать. Для запросов, требующих обработки на стороне сервера, он передаст этот запрос «обработчику» на стороне сервера для обработки, в вашем случае, вероятно, PHP-FPM, который затем передает его демону PHP, который затем выполнит запрос.
Redis не может интерпретировать запрос таким образом. Поэтому вы должны перехватить запрос с помощью Laravel и затем отправить его в Redis. А не наоборот.
Если вы хотите, чтобы Laravel получил информацию от Redis, вы захотите использовать Redis ‘Pub / Sub Feature. Затем вы можете попросить Laravel подписаться на обновления Redis, получать обновления и сохранять данные или обрабатывать их так, как вы хотите.
phpredis lib поддерживает функцию pub / sub.
Вот пример реализации PHP с этой библиотекой.
https://xmeng.wordpress.com/2011/11/14/pubsub-in-redis-using-php/
Вы можете использовать вещание в Laravel для того же. Также вы можете транслировать между несколькими клиентами, используя шепот. Также в нем есть вещатель на основе Redis.
Для начала нужно включить его пакет в композитор.
composer require pusher/pusher-php-server "~3.0"
Настройте учетные данные в app / broadcasting.php
'options' => [
'cluster' => 'eu',
'encrypted' => true
],
Вам также необходимо настроить очередь вещания.
Отправка трансляции
event(new ShippingStatusUpdated($update)); //Broadcasts to everyone, avail to working scope as well
broadcast(new ShippingStatusUpdated($update));//Broadcasts only to others
Прием трансляции
Создание идентификатора сокета для echo [включается в заголовок как X-Socket-ID]
var socketId = Echo.socketId();
Убедитесь, что у вас установлено эхо
npm install --save laravel-echo pusher-js
Создать экземпляр эха
import Echo from "laravel-echo"
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key'
});
Прослушивание событий
Echo.channel('orders')
.listen('OrderShipped', (e) => {
console.log(e.order.name);
});
Трансляция события другим подключенным клиентам, не затрагивая ваше приложение Laravel вообще
Echo.channel('chat')
.whisper('typing', {
name: this.user.name
});
Я думаю, что этот учебник — то, что вы хотите:
Учебник по Laravel 5 и Socket.io
содержит руководство для клиентской и серверной части
Вы могли бы использовать: Socket.IO-Клиент-Swift
проверьте это также: Socket.IO на iOS