我使用laravelapi作为后端,vue作为前端。这些是独立的项目。当我点击redis连接后发布的api时
$redis = Redis::connection();
$redis->publish('new_message_sent',json_encode($request->all()));
它什么也做不了。实际上,当我点击api(使用postman)并返回$redis对象时,它会返回一个空对象。
下面是订阅的节点服务器代码
io.on("connection", function(socket) {
console.log("Client Connecteddddd");
var redisClient = redis.createClient();
redisClient.subscribe("new_message_sent");
redisClient.on("new_message_sent", function(channel, message) {
message = JSON.parse(message);
console.log(message);
});
redisClient.on("disconnect", function() {
redisClient.quit();
});
});
2条答案
按热度按时间oewdyzsn1#
我偶然发现了一个类似的情况,我希望我的redis客户端能够从laravel的服务器接收到发布的消息
Redis
但事实并非如此。我预料到了
Redis::publish('foo', 'bar')
跑的时候捡起来SUBSCRIBE foo
在redis-cli
.运行后
MONITOR
在redis-cli
我注意到发布的频道名称与我预期的不同-{app-name}_database_foo
.这是在中配置的
database.php
在redis.options.prefix
钥匙,这是env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
默认情况下,知道这一点/改变这一点会有所帮助。oxiaedzo2#
你的订阅代码是什么样子的?
带有redis的pub/sub的接收端应该如下所示:
这将是一个长期运行的过程。这将运行并回显任何发布到“您的频道”的内容,直到有东西中断它。
如果您希望为最终用户在浏览器中获取信息,则需要额外的步骤,例如websocket。
pub/sub的性质意味着它永远不会知道在subscribe()发生之前发送的消息,只知道那些在它运行时发生的消息。
对于发布,不需要首先解析连接。
https://laravel.com/docs/master/redis