在laravel api中使用redis发布时不接收消息

hfsqlsce  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(415)

我使用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();
   });
});
oewdyzsn

oewdyzsn1#

我偶然发现了一个类似的情况,我希望我的redis客户端能够从laravel的服务器接收到发布的消息 Redis 但事实并非如此。
我预料到了 Redis::publish('foo', 'bar') 跑的时候捡起来 SUBSCRIBE fooredis-cli .
运行后 MONITORredis-cli 我注意到发布的频道名称与我预期的不同- {app-name}_database_foo .
这是在中配置的 database.phpredis.options.prefix 钥匙,这是 env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), 默认情况下,知道这一点/改变这一点会有所帮助。

oxiaedzo

oxiaedzo2#

你的订阅代码是什么样子的?
带有redis的pub/sub的接收端应该如下所示:

Redis::subscribe(['your-channel'], function ($message) {
            echo $message;
        });

这将是一个长期运行的过程。这将运行并回显任何发布到“您的频道”的内容,直到有东西中断它。
如果您希望为最终用户在浏览器中获取信息,则需要额外的步骤,例如websocket。
pub/sub的性质意味着它永远不会知道在subscribe()发生之前发送的消息,只知道那些在它运行时发生的消息。
对于发布,不需要首先解析连接。

Redis::publish('new_message_sent', json_encode($request->all()));

https://laravel.com/docs/master/redis

相关问题