MongoDbSessionHandler.php

Namespace

Symfony\Component\HttpFoundation\Session\Storage\Handler

File

drupal/core/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php
View source
<?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;
  }

}

Classes

Namesort descending Description
MongoDbSessionHandler MongoDB session handler