【发布时间】:2016-10-25 18:16:56
【问题描述】:
我有一个 laravel 应用程序,在其中我使用 php ratchet 库在客户端和用户之间建立持久连接以进行实时通信(目前这只是一种方式,即只有服务器可以向客户)。
使用这种架构,我怎样才能拥有多个这样的 laravel 服务器,每个服务器都有自己的一组客户端连接到它们,以便相互通信?
我正在考虑使用 REDIS 并拥有一个 redis 服务器,我的所有节点都将连接到该服务器(使用 pub sub)。
我的服务类似于一个群发应用(一个用户有很多群,一个群有很多用户),到目前为止(现在我只有一个服务器,没有redis),我得到了所有用户的群,并为他订阅这些主题(主题名称类似于 GROUP_ 1、GROUP_ 8 、GROUP_ 99 等)。
我想知道每个节点如何订阅 redis 中的特定主题(将所有 redis 消息发送到我的所有节点是没有意义的)。
Laravel 的示例说要像这样使用 php artisan 命令:
class RedisSubscribe extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'redis:subscribe';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Subscribe to a Redis channel';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
Redis::subscribe(['test-channel'], function($message) {
echo $message;
});
}
}
但是,我希望能够在运行时订阅、取消订阅某些主题(在运行 artisan 命令之后)。我怎样才能在 laravel 中做到这一点?
【问题讨论】:
-
1.每个主题成为不同的频道是否有意义?如果是这样,这就是你的答案。 2. 运行时订阅/退订有什么问题?我不知道 Laravel,所以我可能错过了该范式的正确答案。 (
Command类)。但是,只需调用Redis::subscribe(['test-channel'], function($message) { });和Redis::unsubscribe(['test-channel'], function($message) { });就足够了,不是吗? -
事情是,当您运行命令时,php 脚本将永远运行。一旦我启动它,我将如何修改频道?
-
您可以订阅多个频道,包括“client-control”频道甚至“client-3-control”频道。当您从该频道收到“订阅”或“取消订阅”消息时,您将执行该操作。当您收到“停止”消息时,您知道为您订阅的所有频道调用 Redis::unsubscribe 并终止命令(返回)。显然,您需要某种状态存储在某个地方,甚至可能在 Redis 本身中,以允许外部控制器导致这些订阅/取消订阅/停止
标签: php sockets laravel redis ratchet