2022-12-24 22:10:40 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Illuminate\Redis\Connections;
|
|
|
|
|
|
|
|
use Closure;
|
|
|
|
use Illuminate\Contracts\Redis\Connection as ConnectionContract;
|
2024-01-31 22:15:08 +08:00
|
|
|
use Predis\Command\Argument\ArrayableArgument;
|
2022-12-24 22:10:40 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @mixin \Predis\Client
|
|
|
|
*/
|
|
|
|
class PredisConnection extends Connection implements ConnectionContract
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* The Predis client.
|
|
|
|
*
|
|
|
|
* @var \Predis\Client
|
|
|
|
*/
|
|
|
|
protected $client;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a new Predis connection.
|
|
|
|
*
|
|
|
|
* @param \Predis\Client $client
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function __construct($client)
|
|
|
|
{
|
|
|
|
$this->client = $client;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Subscribe to a set of given channels for messages.
|
|
|
|
*
|
|
|
|
* @param array|string $channels
|
|
|
|
* @param \Closure $callback
|
|
|
|
* @param string $method
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function createSubscription($channels, Closure $callback, $method = 'subscribe')
|
|
|
|
{
|
|
|
|
$loop = $this->pubSubLoop();
|
|
|
|
|
|
|
|
$loop->{$method}(...array_values((array) $channels));
|
|
|
|
|
|
|
|
foreach ($loop as $message) {
|
|
|
|
if ($message->kind === 'message' || $message->kind === 'pmessage') {
|
|
|
|
$callback($message->payload, $message->channel);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
unset($loop);
|
|
|
|
}
|
2024-01-31 22:15:08 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Parse the command's parameters for event dispatching.
|
|
|
|
*
|
|
|
|
* @param array $parameters
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function parseParametersForEvent(array $parameters)
|
|
|
|
{
|
|
|
|
return collect($parameters)
|
|
|
|
->transform(function ($parameter) {
|
|
|
|
return $parameter instanceof ArrayableArgument
|
|
|
|
? $parameter->toArray()
|
|
|
|
: $parameter;
|
|
|
|
})->all();
|
|
|
|
}
|
2022-12-24 22:10:40 +08:00
|
|
|
}
|