2019-11-30 07:48:01 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\HttpFoundation\Session\Storage\Handler ;
use Predis\Response\ErrorInterface ;
use Symfony\Component\Cache\Traits\RedisClusterProxy ;
use Symfony\Component\Cache\Traits\RedisProxy ;
/**
* Redis based session storage handler based on the Redis class
* provided by the PHP redis extension .
*
* @ author Dalibor Karlović < dalibor @ flexolabs . io >
*/
class RedisSessionHandler extends AbstractSessionHandler
{
private $redis ;
/**
* @ var string Key prefix for shared environments
*/
private $prefix ;
/**
* @ var int Time to live in seconds
*/
private $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 .
*
* @ param \Redis | \RedisArray | \RedisCluster | \Predis\ClientInterface | RedisProxy | RedisClusterProxy $redis
*
* @ throws \InvalidArgumentException When unsupported client or options are passed
*/
public function __construct ( $redis , array $options = [])
{
if (
! $redis instanceof \Redis &&
! $redis instanceof \RedisArray &&
! $redis instanceof \RedisCluster &&
! $redis instanceof \Predis\ClientInterface &&
! $redis instanceof RedisProxy &&
! $redis instanceof RedisClusterProxy
) {
2020-04-03 15:33:33 +00:00
throw new \InvalidArgumentException ( sprintf ( '"%s()" expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.' , __METHOD__ , \is_object ( $redis ) ? \get_class ( $redis ) : \gettype ( $redis )));
2019-11-30 07:48:01 +00:00
}
if ( $diff = array_diff ( array_keys ( $options ), [ 'prefix' , 'ttl' ])) {
2020-04-03 15:33:33 +00:00
throw new \InvalidArgumentException ( sprintf ( 'The following options are not supported "%s".' , implode ( ', ' , $diff )));
2019-11-30 07:48:01 +00:00
}
$this -> redis = $redis ;
$this -> prefix = $options [ 'prefix' ] ? ? 'sf_s' ;
2020-04-03 15:33:33 +00:00
$this -> ttl = $options [ 'ttl' ] ? ? null ;
2019-11-30 07:48:01 +00:00
}
/**
* { @ inheritdoc }
*/
protected function doRead ( string $sessionId ) : string
{
return $this -> redis -> get ( $this -> prefix . $sessionId ) ? : '' ;
}
/**
* { @ inheritdoc }
*/
protected function doWrite ( string $sessionId , string $data ) : bool
{
2020-04-03 15:33:33 +00:00
$result = $this -> redis -> setEx ( $this -> prefix . $sessionId , ( int ) ( $this -> ttl ? ? ini_get ( 'session.gc_maxlifetime' )), $data );
2019-11-30 07:48:01 +00:00
return $result && ! $result instanceof ErrorInterface ;
}
/**
* { @ inheritdoc }
*/
protected function doDestroy ( string $sessionId ) : bool
{
$this -> redis -> del ( $this -> prefix . $sessionId );
return true ;
}
/**
* { @ inheritdoc }
*/
public function close () : bool
{
return true ;
}
/**
* { @ inheritdoc }
*/
public function gc ( $maxlifetime ) : bool
{
return true ;
}
/**
* @ return bool
*/
public function updateTimestamp ( $sessionId , $data )
{
2020-04-03 15:33:33 +00:00
return ( bool ) $this -> redis -> expire ( $this -> prefix . $sessionId , ( int ) ( $this -> ttl ? ? ini_get ( 'session.gc_maxlifetime' )));
2019-11-30 07:48:01 +00:00
}
}