我正在尝试在本地 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';
}
Run Code Online (Sandbox Code Playgroud)
我在路线中使用上面的代码api/redis:
Route::post('/redis', 'API\MessageController@redis');
Run Code Online (Sandbox Code Playgroud)
我已经订阅了test-channel使用redis-cli命令。如果我在终端实例中使用
手动发布消息,我将正确接收我正在发布的消息。然而,由于某种原因,它们似乎没有与 Laravel 一起发布。
在运行和访问上述路线
时我可以注意到Laravel 记录以下内容:test-channelredis-cliphp artisan serve
[*timestamp*] 127.0.0.1:39448 Accepted
[*timestamp*] 127.0.0.1:39448 Closing
Run Code Online (Sandbox Code Playgroud)
之后的端口127.0.0.1似乎是随机的。
我尝试了 php-redis php 扩展和 predis 包,只是为了确保它不是其中任何一个,但我对它们都得到了相同的结果。我目前正在使用 php-redis,并启用了 igbinary 和 redis 扩展,/etc/php/config.d并已从config/app.php.
我在 Manjaro 上使用 PHP 7.4、Laravel 6.0 和 Redis 5.0.7。
去过那里,发现:
$ redis-client
psubscribe *
Run Code Online (Sandbox Code Playgroud)
会告诉你发生了什么。
您的默认 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_'),
],
Run Code Online (Sandbox Code Playgroud)
在这种情况下,频道名称将以此前缀选项作为前缀。所以你可以只评论这个选项,或者,如果你保留它,请务必订阅正确的频道
Redis::publish('test-channel', 'a test message');
$prefix = config('database.redis.options.prefix');
$channel = $prefix . 'test-channel';
return "Done. (published on $channel)";
Run Code Online (Sandbox Code Playgroud)