2015-08-17 17:00:26 -07: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 ;
/**
* Memcached based session storage handler based on the Memcached class
* provided by the PHP memcached extension .
*
* @ see http :// php . net / memcached
*
* @ author Drak < drak @ zikula . org >
*/
2018-11-23 12:29:20 +00:00
class MemcachedSessionHandler extends AbstractSessionHandler
2015-08-17 17:00:26 -07:00
{
private $memcached ;
/**
* @ var int Time to live in seconds
*/
private $ttl ;
/**
2017-02-02 16:28:38 -08:00
* @ var string Key prefix for shared environments
2015-08-17 17:00:26 -07:00
*/
private $prefix ;
/**
* Constructor .
*
* List of available options :
* * prefix : The prefix to use for the memcached keys in order to avoid collision
2018-11-23 12:29:20 +00:00
* * expiretime : The time to live in seconds .
2015-08-17 17:00:26 -07:00
*
* @ param \Memcached $memcached A \Memcached instance
* @ param array $options An associative array of Memcached options
*
* @ throws \InvalidArgumentException When unsupported options are passed
*/
public function __construct ( \Memcached $memcached , array $options = array ())
{
$this -> memcached = $memcached ;
if ( $diff = array_diff ( array_keys ( $options ), array ( 'prefix' , 'expiretime' ))) {
2018-11-23 12:29:20 +00:00
throw new \InvalidArgumentException ( sprintf ( 'The following options are not supported "%s"' , implode ( ', ' , $diff )));
2015-08-17 17:00:26 -07:00
}
$this -> ttl = isset ( $options [ 'expiretime' ]) ? ( int ) $options [ 'expiretime' ] : 86400 ;
$this -> prefix = isset ( $options [ 'prefix' ]) ? $options [ 'prefix' ] : 'sf2s' ;
}
/**
* { @ inheritdoc }
*/
2018-11-23 12:29:20 +00:00
public function close ()
2015-08-17 17:00:26 -07:00
{
return true ;
}
/**
* { @ inheritdoc }
*/
2018-11-23 12:29:20 +00:00
protected function doRead ( $sessionId )
2015-08-17 17:00:26 -07:00
{
2018-11-23 12:29:20 +00:00
return $this -> memcached -> get ( $this -> prefix . $sessionId ) ? : '' ;
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
2018-11-23 12:29:20 +00:00
public function updateTimestamp ( $sessionId , $data )
2015-08-17 17:00:26 -07:00
{
2018-11-23 12:29:20 +00:00
$this -> memcached -> touch ( $this -> prefix . $sessionId , time () + $this -> ttl );
return true ;
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
2018-11-23 12:29:20 +00:00
protected function doWrite ( $sessionId , $data )
2015-08-17 17:00:26 -07:00
{
return $this -> memcached -> set ( $this -> prefix . $sessionId , $data , time () + $this -> ttl );
}
/**
* { @ inheritdoc }
*/
2018-11-23 12:29:20 +00:00
protected function doDestroy ( $sessionId )
2015-08-17 17:00:26 -07:00
{
2018-11-23 12:29:20 +00:00
$result = $this -> memcached -> delete ( $this -> prefix . $sessionId );
return $result || \Memcached :: RES_NOTFOUND == $this -> memcached -> getResultCode ();
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
public function gc ( $maxlifetime )
{
// not required here because memcached will auto expire the records anyhow.
return true ;
}
/**
2015-10-08 11:40:12 -07:00
* Return a Memcached instance .
2015-08-17 17:00:26 -07:00
*
* @ return \Memcached
*/
protected function getMemcached ()
{
return $this -> memcached ;
}
}