Laravel无法发布到Redis

4
我正在尝试在使用Laravel构建的本地RESTful API中实现Redis发布,目的是为了稍后使用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');

我已经使用redis-cli命令订阅了test-channel频道。
如果我手动在终端实例中使用redis-cli发布消息到test-channel,我可以正确地接收我发布的消息。然而,由于某种原因,它们似乎无法通过Laravel进行发布。
当我运行php artisan serve并访问上述路由时,我可以注意到Laravel记录了以下内容:
[*timestamp*] 127.0.0.1:39448 Accepted
[*timestamp*] 127.0.0.1:39448 Closing

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

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

1个回答

8

携手我们一起探索IT技术的奥秘:

$ redis-client
psubscribe *

将向您展示正在发生的情况。

您的默认配置文件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)";

非常感谢!这帮助我解决了问题 - 我缺少的是前缀。 - WinterChild

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接