首页 > 解决方案 > Laravel 没有发布到 Redis

问题描述

我正在尝试在我的本地 RESTful API 中实现 Redis 发布,该 API 内置在 Laravel 中,以便稍后使用 Web Sockets 实现聊天系统。我打算稍后从 Node.JS 服务器读取它们。

Redis::publish用来向我的test-channel.
但是,由于某种原因,Laravel 似乎没有发布到它。
我还注意到,当我调用 时Redis::set,我设置的任何内容都不会保留在 Redis 中,但是使用Redis::get我可以读取我正在设置的值。

public function redis(Request $request) {
    $data = $request->validate([
        'message' => 'string|required'
    ]);

    Redis::publish('test-channel', 'a test message');

    return 'Done';
}

我在api/redis路线中使用上面的代码:

Route::post('/redis', 'API\MessageController@redis');

我已经订阅了test-channel使用redis-cli命令。如果我在终端实例中使用
手动将消息发布到,我会正确接收我正在发布的消息。但是,由于某种原因,它们似乎没有与 Laravel 一起发布。 在运行和访问上述路线时, 我可以注意到Laravel 记录以下内容:test-channelredis-cli
php artisan serve

[*timestamp*] 127.0.0.1:39448 Accepted
[*timestamp*] 127.0.0.1:39448 Closing

之后的端口127.0.0.1似乎是随机的。

我尝试了 php-redis php 扩展和 predis 包,只是为了确保它不是其中的任何一个,但我对它们都得到了相同的结果。我目前正在使用启用了 igbinary 和 redis 扩展的 php-redis,/etc/php/config.d并已从config/app.php.
我在 Manjaro 上使用 PHP 7.4、Laravel 6.0 和 Redis 5.0.7。

标签: phplaravelredis

解决方案


去过那里,发现:

$ redis-client
psubscribe *

会告诉你发生了什么。

您的默认 config/database.php 可能包含以下内容:

    'redis' => [

    'client' => env('REDIS_CLIENT', 'predis'),

    'options' => [
        'cluster' => env('REDIS_CLUSTER', 'redis'),
        'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
    ],

在这种情况下,频道名称将带有此前缀选项的前缀。所以你可以评论这个选项,或者,如果你保留它,一定要订阅正确的频道

Redis::publish('test-channel', 'a test message');

$prefix = config('database.redis.options.prefix');
$channel = $prefix . 'test-channel';

return "Done. (published on $channel)";

推荐阅读