我正在使用laravel和redis进行实时聊天。我可以从我的laravel中触发事件并将该数据接收到客户端。
我的问题是如何从客户端发送内容然后将其接收到redis并将其传递给laravel
E.g如何检查用户是否已阅读聊天消息。
代码:
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应用程序发出数据。
答案 0 :(得分:4)
Redis是键/值存储引擎。你应该像对待数据库一样对待它。
客户端向接收此请求的Web服务器发送请求,并决定如何处理该请求。对于需要服务器端处理的请求,它会将该请求传递给服务器端"引擎"在您的情况下,可能是PHP-FPM,然后将其传递给PHP守护程序,然后执行请求。
Redis无法以这种方式解释请求。因此,您必须使用Laravel拦截请求,然后将其发送给Redis。不是相反。
如果您尝试让Laravel从Redis获取信息,您将要使用Redis' pub/sub feature。然后,您可以让Laravel订阅Redis更新,获取更新并保留或处理您想要的数据。
phpredis lib支持发布/订阅功能。
以下是使用该lib实现PHP的示例。 https://xmeng.wordpress.com/2011/11/14/pubsub-in-redis-using-php/
答案 1 :(得分:1)
你可以利用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的套接字ID [包含在标头中作为X-Socket-ID]
var socketId = Echo.socketId();
确保已安装echo
npm install --save laravel-echo pusher-js
创建echo实例
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
});
答案 2 :(得分:0)
我认为本教程是你想要的:
Laravel 5 and Socket.io Tutorial
它包含客户端和服务器端的教程
您可以使用:Socket.IO-Client-Swift
另请检查:Socket.IO on iOS