diff --git a/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php b/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php index 1a8ac7797215..0f8f7584a154 100644 --- a/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php +++ b/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php @@ -101,6 +101,10 @@ public function validAuthenticationResponse($request, $result) */ public function broadcast(array $channels, $event, array $payload = []) { + if (empty($channels)) { + return; + } + $connection = $this->redis->connection($this->connection); $payload = json_encode([ @@ -109,8 +113,23 @@ public function broadcast(array $channels, $event, array $payload = []) 'socket' => Arr::pull($payload, 'socket'), ]); - foreach ($this->formatChannels($channels) as $channel) { - $connection->publish($channel, $payload); - } + $connection->eval($this->broadcastMultipleChannelsScript(), 0, $payload, ...$this->formatChannels($channels)); + } + + /** + * Get the Lua script for broadcasting to multiple channels. + * + * ARGV[1] - The payload + * ARGV[2...] - The channels + * + * @return string + */ + protected function broadcastMultipleChannelsScript() + { + return <<<'LUA' +for i = 2, #ARGV do + redis.call('publish', ARGV[i], ARGV[1]) +end +LUA; } }