<?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;
/**
* MongoDB session handler
*
* @author Markus Bachmann <markus.bachmann@bachi.biz>
*/
class MongoDbSessionHandler implements \SessionHandlerInterface {
/**
* @var \Mongo
*/
private $mongo;
/**
* @var \MongoCollection
*/
private $collection;
/**
* @var array
*/
private $options;
/**
* Constructor.
*
* @param \Mongo $mongo A "Mongo" instance
* @param array $options An associative array of field options
*
* @throws \InvalidArgumentException When "database" or "collection" not provided
*/
public function __construct(\Mongo $mongo, array $options) {
if (!isset($options['database']) || !isset($options['collection'])) {
throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler');
}
$this->mongo = $mongo;
$this->options = array_merge(array(
'id_field' => 'sess_id',
'data_field' => 'sess_data',
'time_field' => 'sess_time',
), $options);
}
/**
* {@inheritDoc}
*/
public function open($savePath, $sessionName) {
return true;
}
/**
* {@inheritDoc}
*/
public function close() {
return true;
}
/**
* {@inheritDoc}
*/
public function destroy($sessionId) {
$this
->getCollection()
->remove(array(
$this->options['id_field'] => $sessionId,
), array(
'justOne' => true,
));
return true;
}
/**
* {@inheritDoc}
*/
public function gc($lifetime) {
$time = new \MongoTimestamp(time() - $lifetime);
$this
->getCollection()
->remove(array(
$this->options['time_field'] => array(
'$lt' => $time,
),
));
}
/**
* {@inheritDoc]
*/
public function write($sessionId, $data) {
$data = array(
$this->options['id_field'] => $sessionId,
$this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY),
$this->options['time_field'] => new \MongoTimestamp(),
);
$this
->getCollection()
->update(array(
$this->options['id_field'] => $sessionId,
), array(
'$set' => $data,
), array(
'upsert' => true,
));
return true;
}
/**
* {@inheritDoc}
*/
public function read($sessionId) {
$dbData = $this
->getCollection()
->findOne(array(
$this->options['id_field'] => $sessionId,
));
return null === $dbData ? '' : $dbData[$this->options['data_field']]->bin;
}
/**
* Return a "MongoCollection" instance
*
* @return \MongoCollection
*/
private function getCollection() {
if (null === $this->collection) {
$this->collection = $this->mongo
->selectDB($this->options['database'])
->selectCollection($this->options['collection']);
}
return $this->collection;
}
}
Name | Description |
---|---|
MongoDbSessionHandler | MongoDB session handler |