Как отправить данные от клиента на 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