<?php /** * Copyright © 2024 ExacTI Technology Solutions. All rights reserved. * GPLv3 General License. * https://exacti.com.br * Phacil PHP Framework - https://github.com/exacti/phacil-framework */ namespace Phacil\Framework\Session\Handlers; use Cm\RedisSession\Handler\ConfigInterface; use Cm\RedisSession\Handler\LoggerInterface; use Cm\RedisSession\ConnectionFailedException; use Cm\RedisSession\ConcurrentConnectionsExceededException; use Phacil\Framework\Exception; /** * Redis handler for PHP Session * * @since 2.0.0 * @package Phacil\Framework\Session\Handlers */ class Redis implements \Phacil\Framework\Session\Api\HandlerInterface { const SHORT_NAME = 'redis'; private $savePath; /** * * @var \Cm\RedisSession\Handler[] */ private $connection; /** * * @var \Cm\RedisSession\Handler\ConfigInterface */ private $config; /** * * @var \Cm\RedisSession\Handler\LoggerInterface */ private $logger; private $name; /** * @param ConfigInterface $config * @param LoggerInterface $logger * @param Filesystem $filesystem * @throws Exception */ public function __construct(ConfigInterface $config, LoggerInterface $logger) { $this->config = $config; $this->logger = $logger; } /** * Get connection * * @return \Cm\RedisSession\Handler * @throws Exception */ private function getConnection() { $pid = getmypid(); if (!isset($this->connection[$pid])) { try { //$this->connection[$pid] = new \Cm\RedisSession\Handler($this->config, $this->logger); $this->connection[$pid] = new \Phacil\Framework\Session\Redis\AbstractCM\Handler($this->config, $this->logger); } catch (ConnectionFailedException $e) { throw new Exception(($e->getMessage())); } } return $this->connection[$pid]; } /** {@inheritdoc} */ function setName($name){ $this->name = $name; return $this; } /** * Open session * * @param string $savePath ignored * @param string $sessionName ignored * @return bool * @throws Exception */ #[\ReturnTypeWillChange] public function open($savePath, $sessionName) { return (bool)$this->getConnection()->open($savePath, $sessionName); } /** * Fetch session data * * @param string $sessionId * @return string * @throws ConcurrentConnectionsExceededException * @throws Exception */ #[\ReturnTypeWillChange] public function read($sessionId) { try { return $this->getConnection()->read($sessionId); } catch (ConcurrentConnectionsExceededException $e) { throw new Exception($e->getMessage(), 1); } } /** * Update session * * @param string $sessionId * @param string $sessionData * @return boolean * @throws Exception */ #[\ReturnTypeWillChange] public function write($sessionId, $sessionData) { try { //$this->getConnection()->setName($this->name); $cha = $this->getConnection()->write($sessionId, $sessionData); return (bool) $cha; } catch (ConcurrentConnectionsExceededException $e) { throw new Exception($e->getMessage(), 1); } } /** * Destroy session * * @param string $sessionId * @return boolean * @throws Exception */ #[\ReturnTypeWillChange] public function destroy($sessionId) { return (bool) $this->getConnection()->destroy($sessionId); } /** * Overridden to prevent calling getLifeTime at shutdown * * @return bool * @throws Exception */ #[\ReturnTypeWillChange] public function close() { return (bool)$this->getConnection()->close(); } /** * Garbage collection * * @param int $maxLifeTime ignored * @return boolean * @throws Exception * @SuppressWarnings(PHPMD.ShortMethodName) */ #[\ReturnTypeWillChange] public function gc($maxLifeTime) { return $this->getConnection()->gc($maxLifeTime); } /** * Get the number of failed lock attempts * * @return int * @throws Exception */ public function getFailedLockAttempts() { return $this->getConnection()->getFailedLockAttempts(); } }