Как отправить данные от клиента на redis, а затем после laravel
Я использую 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.
Ответы
Ответ 1
Redis - это механизм хранения ключей/значений. Вы должны рассматривать его как базу данных.
Клиент отправляет запрос на веб-сервер, который получает этот запрос и решает, что с ним делать. Для запросов, требующих обработки на стороне сервера, он передаст этот запрос серверному "движку" для обработки, в вашем случае, вероятно, PHP-FPM, который затем передает его демону PHP, который затем выполнит запрос.
Redis не может интерпретировать запрос таким образом. Поэтому вы должны перехватить запрос с Laravel, а затем отправить его Redis. Не наоборот.
Если вы пытаетесь получить Laravel из Redis, вы захотите использовать Redis 'pub/sub feature. Затем вы можете подписаться на Larvel на обновления Redis, получать обновления и сохранять или обрабатывать данные, но вы хотите.
phpredis lib поддерживает функцию pub/sub.
Вот пример реализации PHP с этим lib.
https://xmeng.wordpress.com/2011/11/14/pubsub-in-redis-using-php/
Ответ 2
Вы можете использовать Broadcasting в Laravel для того же самого. Также вы можете транслировать несколько клиентов с помощью шепота. Кроме того, в нем есть вещательная компания redis.
Сначала вам нужно включить его пакет в композитор.
composer require pusher/pusher-php-server "~3.0"
Настройте учетные данные в приложении /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
Получение широковещательной рассылки
Инициализировать идентификатор сокета для эха [включен в заголовок как 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
Ответ 3
Я думаю, что этот учебник - это то, что вы хотите:
Laravel 5 и Socket.io Tutorial
содержит руководство для клиентской и серверной сторон
и для ios
вы можете использовать: Socket.IO-Client-Swift
проверьте это также: Socket.IO на iOS