[HttpFoundation] Added pure Memcache, Memcached and Null storage drivers.
This commit is contained in:
parent
e185c8d63b
commit
669bc96c7f
@ -0,0 +1,143 @@
|
|||||||
|
<?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\SessionStorage;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpFoundation\AttributeBagInterface;
|
||||||
|
use Symfony\Component\HttpFoundation\FlashBagInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MemcacheSessionStorage.
|
||||||
|
*
|
||||||
|
* @author Drak <drak@zikula.org>
|
||||||
|
*/
|
||||||
|
class MemcacheSessionStorage extends AbstractSessionStorage implements SessionSaveHandlerInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Memcache driver.
|
||||||
|
*
|
||||||
|
* @var Memcache
|
||||||
|
*/
|
||||||
|
private $memcache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration options.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $memcacheOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Key prefix for shared environments.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $prefix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param \Memcache $memcache A \Memcache instance
|
||||||
|
* @param array $memcacheOptions An associative array of Memcachge options
|
||||||
|
* @param array $options Session configuration options.
|
||||||
|
* @param AttributeBagInterface $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag)
|
||||||
|
* @param FlashBagInterface $flashes A FlashBagInterface instance (defaults null for default FlashBag)
|
||||||
|
*
|
||||||
|
* @see AbstractSessionStorage::__construct()
|
||||||
|
*/
|
||||||
|
public function __construct(\Memcache $memcache, array $memcacheOptions = array(), array $options = array(), AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null)
|
||||||
|
{
|
||||||
|
$this->memcache = $memcache;
|
||||||
|
|
||||||
|
// defaults
|
||||||
|
if (!isset($memcacheOptions['serverpool'])) {
|
||||||
|
$memcacheOptions['serverpool'] = array(
|
||||||
|
'host' => '127.0.0.1',
|
||||||
|
'port' => 11211,
|
||||||
|
'timeout' => 1,
|
||||||
|
'persistent' => false,
|
||||||
|
'weight' => 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcacheOptions['expiretime'] = isset($memcacheOptions['expiretime']) ? (int)$memcacheOptions['expiretime'] : 86400;
|
||||||
|
$this->prefix = isset($memcachedOptions['prefix']) ? $memcachedOptions['prefix'] : 'sf2s';
|
||||||
|
|
||||||
|
$this->memcacheOptions = $memcacheOptions;
|
||||||
|
|
||||||
|
parent::__construct($attributes, $flashes, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addServer(array $server)
|
||||||
|
{
|
||||||
|
if (array_key_exists('host', $server)) {
|
||||||
|
throw new \InvalidArgumentException('host key must be set');
|
||||||
|
}
|
||||||
|
$server['port'] = isset($server['port']) ? (int)$server['port'] : 11211;
|
||||||
|
$server['timeout'] = isset($server['timeout']) ? (int)$server['timeout'] : 1;
|
||||||
|
$server['presistent'] = isset($server['presistent']) ? (bool)$server['presistent'] : false;
|
||||||
|
$server['weight'] = isset($server['weight']) ? (bool)$server['weight'] : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionOpen($savePath, $sessionName)
|
||||||
|
{
|
||||||
|
foreach ($this->memcacheOptions['serverpool'] as $server) {
|
||||||
|
$this->addServer($server);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionClose()
|
||||||
|
{
|
||||||
|
return $this->memcache->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionRead($sessionId)
|
||||||
|
{
|
||||||
|
$result = $this->memcache->get($this->prefix.$sessionId);
|
||||||
|
|
||||||
|
return ($result) ? $result : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionWrite($sessionId, $data)
|
||||||
|
{
|
||||||
|
return $this->memcache->set($this->prefix.$sessionId, $data, $this->memcacheOptions['expiretime']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionDestroy($sessionId)
|
||||||
|
{
|
||||||
|
return $this->memcache->delete($this->prefix.$sessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionGc($lifetime)
|
||||||
|
{
|
||||||
|
// not required here because memcache will auto expire the records anyhow.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,144 @@
|
|||||||
|
<?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\SessionStorage;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpFoundation\AttributeBagInterface;
|
||||||
|
use Symfony\Component\HttpFoundation\FlashBagInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MemcachedSessionStorage.
|
||||||
|
*
|
||||||
|
* @author Drak <drak@zikula.org>
|
||||||
|
*/
|
||||||
|
class MemcachedSessionStorage extends AbstractSessionStorage implements SessionSaveHandlerInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Memcached driver.
|
||||||
|
*
|
||||||
|
* @var Memcached
|
||||||
|
*/
|
||||||
|
private $memcached;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration options.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $memcachedOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param \Memcached $memcached A \Memcached instance
|
||||||
|
* @param array $memcachedOptions An associative array of Memcached options
|
||||||
|
* @param array $options Session configuration options.
|
||||||
|
* @param AttributeBagInterface $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag)
|
||||||
|
* @param FlashBagInterface $flashes A FlashBagInterface instance (defaults null for default FlashBag)
|
||||||
|
*
|
||||||
|
* @see AbstractSessionStorage::__construct()
|
||||||
|
*/
|
||||||
|
public function __construct(\Memcached $memcache, array $memcachedOptions = array(), array $options = array(), AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null)
|
||||||
|
{
|
||||||
|
$this->memcached = $memcached;
|
||||||
|
|
||||||
|
// defaults
|
||||||
|
if (!isset($memcachedOptions['serverpool'])) {
|
||||||
|
$memcachedOptions['serverpool'] = array(
|
||||||
|
'host' => '127.0.0.1',
|
||||||
|
'port' => 11211,
|
||||||
|
'timeout' => 1,
|
||||||
|
'persistent' => false,
|
||||||
|
'weight' => 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcachedOptions['expiretime'] = isset($memcachedOptions['expiretime']) ? (int)$memcachedOptions['expiretime'] : 86400;
|
||||||
|
|
||||||
|
$this->memcached->setOption(\Memcached::OPT_PREFIX_KEY, isset($memcachedOptions['prefix']) ? $memcachedOption['prefix'] : 'sf2s');
|
||||||
|
|
||||||
|
$this->memcacheOptions = $memcachedOptions;
|
||||||
|
|
||||||
|
parent::__construct($attributes, $flashes, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionOpen($savePath, $sessionName)
|
||||||
|
{
|
||||||
|
foreach ($this->memcachedOptions['serverpool'] as $server) {
|
||||||
|
$this->addServer($server);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close session.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function sessionClose()
|
||||||
|
{
|
||||||
|
return $this->memcached->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionRead($sessionId)
|
||||||
|
{
|
||||||
|
$result = $this->memcached->get($this->prefix.$sessionId);
|
||||||
|
|
||||||
|
return $result ? $result : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionWrite($sessionId, $data)
|
||||||
|
{
|
||||||
|
return $this->memcached->set($this->prefix.$sessionId, $data, false, $this->memcachedOptions['expiretime']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionDestroy($sessionId)
|
||||||
|
{
|
||||||
|
return $this->memcached->delete($this->prefix.$sessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionGc($lifetime)
|
||||||
|
{
|
||||||
|
// not required here because memcached will auto expire the records anyhow.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a server to the memcached handler.
|
||||||
|
*
|
||||||
|
* @param array $server
|
||||||
|
*/
|
||||||
|
protected function addServer(array $server)
|
||||||
|
{
|
||||||
|
if (array_key_exists('host', $server)) {
|
||||||
|
throw new \InvalidArgumentException('host key must be set');
|
||||||
|
}
|
||||||
|
$server['port'] = isset($server['port']) ? (int)$server['port'] : 11211;
|
||||||
|
$server['timeout'] = isset($server['timeout']) ? (int)$server['timeout'] : 1;
|
||||||
|
$server['presistent'] = isset($server['presistent']) ? (bool)$server['presistent'] : false;
|
||||||
|
$server['weight'] = isset($server['weight']) ? (bool)$server['weight'] : 1;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,77 @@
|
|||||||
|
<?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\SessionStorage;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpFoundation\AttributeBagInterface;
|
||||||
|
use Symfony\Component\HttpFoundation\FlashBagInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NullSessionStorage.
|
||||||
|
*
|
||||||
|
* Can be used in unit testing or in a sitation where persisted sessions are not desired.
|
||||||
|
*
|
||||||
|
* @author Drak <drak@zikula.org>
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
class NullSessionStorage extends AbstractSessionStorage implements SessionSaveHandlerInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionOpen($savePath, $sessionName)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close session.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function sessionClose()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionRead($sessionId)
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionWrite($sessionId, $data)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionDestroy($sessionId)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sessionGc($lifetime)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Tests\Component\HttpFoundation\SessionStorage;
|
||||||
|
use Symfony\Component\HttpFoundation\SessionStorage\NullSessionStorage;
|
||||||
|
use Symfony\Component\HttpFoundation\AttributeBag;
|
||||||
|
use Symfony\Component\HttpFoundation\FlashBag;
|
||||||
|
use Symfony\Component\HttpFoundation\Session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for NullSessionStorage.
|
||||||
|
*
|
||||||
|
* @author Drak <drak@zikula.org>
|
||||||
|
*
|
||||||
|
* @runTestsInSeparateProcesses
|
||||||
|
*/
|
||||||
|
class NullSessionStorageTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
public function testConstructDefaults()
|
||||||
|
{
|
||||||
|
$storage = new NullSessionStorage();
|
||||||
|
$this->assertEquals('user', ini_get('session.save_handler'));
|
||||||
|
$this->assertInstanceOf('Symfony\Component\HttpFoundation\AttributeBagInterface', $storage->getAttributes());
|
||||||
|
$this->assertInstanceOf('Symfony\Component\HttpFoundation\FlashBagInterface', $storage->getFlashes());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSaveHandlers()
|
||||||
|
{
|
||||||
|
$storage = new NullSessionStorage();
|
||||||
|
$this->assertEquals('user', ini_get('session.save_handler'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSession()
|
||||||
|
{
|
||||||
|
session_id('nullsessionstorage');
|
||||||
|
$storage = new NullSessionStorage();
|
||||||
|
$session = new Session($storage);
|
||||||
|
$this->assertNull($session->get('something'));
|
||||||
|
$session->set('something', 'unique');
|
||||||
|
$this->assertEquals('unique', $session->get('something'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNothingIsPersisted()
|
||||||
|
{
|
||||||
|
session_id('nullsessionstorage');
|
||||||
|
$storage = new NullSessionStorage();
|
||||||
|
$session = new Session($storage);
|
||||||
|
$session->start();
|
||||||
|
$this->assertEquals('nullsessionstorage', $session->getId());
|
||||||
|
$this->assertNull($session->get('something'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user