如何将数据从客户端发送到Redis,然后再发送到Laravel?

14

我正在使用 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应用程序发出数据。


你应该使用 AJAX 请求来实现异步的客户端到服务器的更新。 - milo526
你有看到我上一条留言吗? - Mr. Engineer
是的,我做到了,为什么你不能从客户端向服务器发送请求? - milo526
3个回答

5

Redis是一个键值存储引擎。您应该将其视为数据库。

客户端发送请求到Web服务器,该服务器接收此请求并决定如何处理它。对于需要服务器端处理的请求,它将将该请求传递给服务器端“引擎”进行处理,在您的情况下可能是PHP-FPM,然后将其传递给将执行该请求的PHP守护程序。

Redis无法以这种方式解释请求。因此,您必须使用Laravel拦截请求,然后将其发送到Redis。而不是相反。

如果您想让Laravel从Redis获取信息,则需要使用Redis的发布/订阅功能。然后,您可以让Laravel订阅Redis更新,获取更新并按照您想要的方式保留或处理数据。

phpredis lib支持发布/订阅功能。

这里是使用该库的PHP实现示例。 https://xmeng.wordpress.com/2011/11/14/pubsub-in-redis-using-php/


2
你可以利用Laravel中的广播功能来实现。同时,你可以使用whisper在多个客户端之间进行广播。此外,它还有一个基于redis的广播器。
首先,你需要在composer中包含它的包。
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

接收广播

实例化回显的套接字ID [包含在标头中作为X-Socket-ID]

var socketId = Echo.socketId();

请确保您已安装了echo

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 广播文档


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接