diff --git a/src/Cm/RedisSession/Handler.php b/src/Cm/RedisSession/Handler.php index 671f099..5be8c80 100644 --- a/src/Cm/RedisSession/Handler.php +++ b/src/Cm/RedisSession/Handler.php @@ -253,6 +253,13 @@ class Handler implements \SessionHandlerInterface * @var boolean */ private $_readOnly; + + /** + * Additional Configurable Prefix for Session + * + * @var string + */ + private $_prefixAdditional; /** * @param ConfigInterface $config @@ -284,6 +291,7 @@ public function __construct(ConfigInterface $config, LoggerInterface $logger, $r $this->_failAfter = $this->config->getFailAfter() ?: self::DEFAULT_FAIL_AFTER; $this->_maxLifetime = $this->config->getMaxLifetime() ?: self::DEFAULT_MAX_LIFETIME; $this->_minLifetime = $this->config->getMinLifetime() ?: self::DEFAULT_MIN_LIFETIME; + $this->_prefixAdditional = $this->config->getPrefix() ?: ''; $this->_useLocking = ! $this->config->getDisableLocking(); // Use sleep time multiplier so fail after time is in seconds @@ -411,7 +419,7 @@ protected function hasConnection() public function read($sessionId) { // Get lock on session. Increment the "lock" field and if the new value is 1, we have the lock. - $sessionId = self::SESSION_PREFIX.$sessionId; + $sessionId = 'sess_'.$this->_prefixAdditional.$sessionId; $tries = $waiting = $lock = 0; $lockPid = $oldLockPid = null; // Restart waiting for lock when current lock holder changes $detectZombies = false; @@ -616,6 +624,8 @@ public function read($sessionId) */ public function write($sessionId, $sessionData) { + $sessionId = 'sess_'.$this->_prefixAdditional.$sessionId; + if ($this->_sessionWritten || $this->_readOnly) { $this->_log(sprintf(($this->_sessionWritten ? "Repeated" : "Read-only") . " session write detected; skipping for ID %s", $sessionId)); return true; @@ -628,7 +638,7 @@ public function write($sessionId, $sessionData) if($this->_dbNum) $this->_redis->select($this->_dbNum); // Prevent conflicts with other connections? if ( ! $this->_useLocking - || ( ! ($pid = $this->_redis->hGet('sess_'.$sessionId, 'pid')) || $pid == $this->_getPid()) + || ( ! ($pid = $this->_redis->hGet($sessionId, 'pid')) || $pid == $this->_getPid()) ) { $this->_writeRawSession($sessionId, $sessionData, $this->getLifeTime()); $this->_log(sprintf("Data written to ID %s in %.5f seconds", $sessionId, (microtime(true) - $timeStart))); @@ -661,10 +671,12 @@ public function write($sessionId, $sessionData) */ public function destroy($sessionId) { + + $sessionId = 'sess_'.$this->_prefixAdditional.$sessionId; $this->_log(sprintf("Destroying ID %s", $sessionId)); $this->_redis->pipeline(); if($this->_dbNum) $this->_redis->select($this->_dbNum); - $this->_redis->del(self::SESSION_PREFIX.$sessionId); + $this->_redis->del($sessionId); $this->_redis->exec(); return true; } @@ -828,15 +840,14 @@ protected function _decodeData($data) */ protected function _writeRawSession($id, $data, $lifetime) { - $sessionId = 'sess_' . $id; $this->_redis->pipeline() ->select($this->_dbNum) - ->hMSet($sessionId, array( + ->hMSet($id, array( 'data' => $this->_encodeData($data), 'lock' => 0, // 0 so that next lock attempt will get 1 )) - ->hIncrBy($sessionId, 'writes', 1) - ->expire($sessionId, min((int)$lifetime, (int)$this->_maxLifetime)) + ->hIncrBy($id, 'writes', 1) + ->expire($id, min((int)$lifetime, (int)$this->_maxLifetime)) ->exec(); } diff --git a/src/Cm/RedisSession/Handler/ConfigInterface.php b/src/Cm/RedisSession/Handler/ConfigInterface.php index a315c20..db9a760 100644 --- a/src/Cm/RedisSession/Handler/ConfigInterface.php +++ b/src/Cm/RedisSession/Handler/ConfigInterface.php @@ -192,4 +192,14 @@ public function getSentinelVerifyMaster(); * @return string */ public function getSentinelConnectRetries(); + + + /** + * Get configurable prefix for session ID + * + * @return string + */ + public function getPrefix(); + + }