我使用 laravel api 作为后端,使用 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();
});
});
我偶然发现了类似的情况,我希望我的 Redis 客户端能够收到来自 Laravel 的
Redis
Facade 的已发布消息,但事实并非如此。
我预计在
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_'),
,了解这一点/更改它会有所帮助。
您的订阅代码是什么样的?
使用 Redis 的 pub/sub 接收端应该如下所示:
Redis::subscribe(['your-channel'], function ($message) {
echo $message;
});
这将是一个长期运行的过程。这将运行并回显发布到“您的频道”的任何内容,直到有东西中断它。
如果您希望将信息传输到最终用户的浏览器,则需要额外的步骤,例如 Websocket。
pub/sub 的本质意味着它永远不会知道在 subscribe() 发生之前发送的消息,只知道那些在运行时发生的消息。
对于发布,您不需要首先解析连接。
Redis::publish('new_message_sent', json_encode($request->all()));
这也许有帮助:
Laravel 11,在 config/database.php 中,你有:
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
所以,laravel 添加前缀。
要解决此问题,您只需定义空前缀即可:
REDIS_PREFIX=