client; } /** * Subscribe to a set of given channels for messages. * * @param array|string $channels * @param \Closure $callback * @return void */ public function subscribe($channels, Closure $callback) { $this->createSubscription($channels, $callback, __FUNCTION__); } /** * Subscribe to a set of given channels with wildcards. * * @param array|string $channels * @param \Closure $callback * @return void */ public function psubscribe($channels, Closure $callback) { $this->createSubscription($channels, $callback, __FUNCTION__); } /** * Run a command against the Redis database. * * @param string $method * @param array $parameters * @return mixed * * @throws \Throwable */ public function command($method, array $parameters = []) { $start = microtime(true); try { $result = $this->client->{$method}(...$parameters); } catch (Throwable $e) { $this->events?->dispatch(new CommandFailed( $method, $this->parseParametersForEvent($parameters), $e, $this )); throw $e; } $time = round((microtime(true) - $start) * 1000, 2); $this->events?->dispatch(new CommandExecuted( $method, $this->parseParametersForEvent($parameters), $time, $this )); return $result; } /** * Parse the command's parameters for event dispatching. * * @param array $parameters * @return array */ protected function parseParametersForEvent(array $parameters) { return $parameters; } /** * Fire the given event if possible. * * @param mixed $event * @return void * * @deprecated since Laravel 11.x */ protected function event($event) { $this->events?->dispatch($event); } /** * Register a Redis command listener with the connection. * * @param \Closure $callback * @return void */ public function listen(Closure $callback) { $this->events?->listen(CommandExecuted::class, $callback); } /** * Register a Redis command failure listener with the connection. * * @param \Closure $callback * @return void */ public function listenForFailures(Closure $callback) { $this->events?->listen(CommandFailed::class, $callback); } /** * Determine if the connection is a cluster connection. * * @return bool */ public function isCluster() { return false; } /** * Get the connection name. * * @return string|null */ public function getName() { return $this->name; } /** * Set the connection's name. * * @param string $name * @return $this */ public function setName($name) { $this->name = $name; return $this; } /** * Get the event dispatcher used by the connection. * * @return \Illuminate\Contracts\Events\Dispatcher|null */ public function getEventDispatcher() { return $this->events; } /** * Set the event dispatcher instance on the connection. * * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ public function setEventDispatcher(Dispatcher $events) { $this->events = $events; } /** * Unset the event dispatcher instance on the connection. * * @return void */ public function unsetEventDispatcher() { $this->events = null; } /** * Determine if the given key contains a Redis Cluster hash tag. * * @param string $key * @return bool */ public static function hasHashTag(string $key): bool { $open = strpos($key, '{'); if ($open === false) { return false; } $close = strpos($key, '}', $open + 1); return $close !== false && $close - $open > 1; } /** * Pass other method calls down to the underlying client. * * @param string $method * @param array $parameters * @return mixed */ public function __call($method, $parameters) { if (static::hasMacro($method)) { return $this->macroCall($method, $parameters); } return $this->command($method, $parameters); } }