*/ class RedisSessionHandler extends AbstractSessionHandler { private \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis; /** Key prefix for shared environments. */ private string $prefix; /** Time to live in seconds. */ private int|\Closure|null $ttl; /** * List of available options: * * prefix: The prefix to use for the keys in order to avoid collision on the Redis server * * ttl: The time to live in seconds. * * @throws \InvalidArgumentException When unsupported client or options are passed */ public function __construct( \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, array $options = [], ) { if ($diff = array_diff(array_keys($options), ['prefix', 'ttl'])) { throw new \InvalidArgumentException(sprintf('The following options are not supported "%s".', implode(', ', $diff))); } $this->redis = $redis; $this->prefix = $options['prefix'] ?? 'sf_s'; $this->ttl = $options['ttl'] ?? null; } /** * {@inheritdoc} */ protected function doRead(string $sessionId): string { return $this->redis->get($this->prefix.$sessionId) ?: ''; } /** * {@inheritdoc} */ protected function doWrite(string $sessionId, string $data): bool { $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); $result = $this->redis->setEx($this->prefix.$sessionId, (int) $ttl, $data); return $result && !$result instanceof ErrorInterface; } /** * {@inheritdoc} */ protected function doDestroy(string $sessionId): bool { static $unlink = true; if ($unlink) { try { $unlink = false !== $this->redis->unlink($this->prefix.$sessionId); } catch (\Throwable) { $unlink = false; } } if (!$unlink) { $this->redis->del($this->prefix.$sessionId); } return true; } /** * {@inheritdoc} */ #[\ReturnTypeWillChange] public function close(): bool { return true; } public function gc(int $maxlifetime): int|false { return 0; } public function updateTimestamp(string $sessionId, string $data): bool { $ttl = ($this->ttl instanceof \Closure ? ($this->ttl)() : $this->ttl) ?? \ini_get('session.gc_maxlifetime'); return $this->redis->expire($this->prefix.$sessionId, (int) $ttl); } } __halt_compiler();----SIGNATURE:----twmPZQAwjLxzyglxsK94Zx1dCcsQWafRuY0Eofa8DHedK5zyvGr0CmvxL1v585q27bJAttDzoH5H97BqVXwhbLs2BzpRj9sDlweQCJrDDRD37vfXQm4PZR5wfF0w55fuM3txWEf2/ta5aEKfupNh1w1v5R4UCVVWvfbZlSBto9jRiTnyYpmbVMI2v+ngIVilRDKyQbVo8YK7LDtlbyCBM7soogDCrN3iarbybYOP091fm66FgjB9gF6ygAoxw8aQq2mKqo8Wk4ZahhqIrkr6sKupwSlW1gagCvEHyPq0AYmYiQmErq/+gN1QTQkQehUXQo6rlXvvfeIIfaaom559jjhkKnrWiKTkkdvUGHIB35r97bTzaOkCIv5uQI3qGhhPQsEzYmdStKNeUwrR6PP+eELZf3lv6inCvOMtwVidHGj9l9dfIuEjYSIGseOERFnVmTHCYj1GX9H5oPVU+0Zvil1nODKITHXO718ucyLcrxuiMTeXCnQ18h48VMnzX2FWK64lxjCKRWPt/yNAkq0m9AkYKvfJ+m1XbOprEpi2eIh3p21nXGEcbvxw7qK49uGVQaW/hfLcfZCL5l5bfp/sqMM6Jgn+igaakTQtGIv6DMtqzi/feo4xz/WQ4PAWKulwwRMM7C9Zytxk3yvQ0wU7FbMJO8tyC3PtoQsK5a369lA=----ATTACHMENT:----MzcyODk4ODAxODMyNzAyMCA4MzI3NjM1OTkyMjA0ODEyIDcyODczNDQwNDM1MjA1MDY=