Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

MongoDbSessionHandler.php

Zuletzt modifiziert: 09.10.2024, 12:59 - Dateigröße: 4.31 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of the Symfony package.
 005   *
 006   * (c) Fabien Potencier <fabien@symfony.com>
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 013   
 014  /**
 015   * MongoDB session handler
 016   *
 017   * @author Markus Bachmann <markus.bachmann@bachi.biz>
 018   */
 019  class MongoDbSessionHandler implements \SessionHandlerInterface
 020  {
 021      /**
 022       * @var \Mongo
 023       */
 024      private $mongo;
 025   
 026      /**
 027       * @var \MongoCollection
 028       */
 029      private $collection;
 030   
 031      /**
 032       * @var array
 033       */
 034      private $options;
 035   
 036      /**
 037       * Constructor.
 038       *
 039       * List of available options:
 040       *  * database: The name of the database [required]
 041       *  * collection: The name of the collection [required]
 042       *  * id_field: The field name for storing the session id [default: _id]
 043       *  * data_field: The field name for storing the session data [default: data]
 044       *  * time_field: The field name for storing the timestamp [default: time]
 045       *
 046       * @param \Mongo|\MongoClient $mongo   A MongoClient or Mongo instance
 047       * @param array               $options An associative array of field options
 048       *
 049       * @throws \InvalidArgumentException When MongoClient or Mongo instance not provided
 050       * @throws \InvalidArgumentException When "database" or "collection" not provided
 051       */
 052      public function __construct($mongo, array $options)
 053      {
 054          if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo)) {
 055              throw new \InvalidArgumentException('MongoClient or Mongo instance required');
 056          }
 057   
 058          if (!isset($options['database']) || !isset($options['collection'])) {
 059              throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler');
 060          }
 061   
 062          $this->mongo = $mongo;
 063   
 064          $this->options = array_merge(array(
 065              'id_field'   => '_id',
 066              'data_field' => 'data',
 067              'time_field' => 'time',
 068          ), $options);
 069      }
 070   
 071      /**
 072       * {@inheritdoc}
 073       */
 074      public function open($savePath, $sessionName)
 075      {
 076          return true;
 077      }
 078   
 079      /**
 080       * {@inheritdoc}
 081       */
 082      public function close()
 083      {
 084          return true;
 085      }
 086   
 087      /**
 088       * {@inheritdoc}
 089       */
 090      public function destroy($sessionId)
 091      {
 092          $this->getCollection()->remove(array(
 093              $this->options['id_field'] => $sessionId,
 094          ));
 095   
 096          return true;
 097      }
 098   
 099      /**
 100       * {@inheritdoc}
 101       */
 102      public function gc($maxlifetime)
 103      {
 104          /* Note: MongoDB 2.2+ supports TTL collections, which may be used in
 105           * place of this method by indexing the "time_field" field with an
 106           * "expireAfterSeconds" option. Regardless of whether TTL collections
 107           * are used, consider indexing this field to make the remove query more
 108           * efficient.
 109           *
 110           * See: http://docs.mongodb.org/manual/tutorial/expire-data/
 111           */
 112          $time = new \MongoDate(time() - $maxlifetime);
 113   
 114          $this->getCollection()->remove(array(
 115              $this->options['time_field'] => array('$lt' => $time),
 116          ));
 117   
 118          return true;
 119      }
 120   
 121      /**
 122       * {@inheritdoc}
 123       */
 124      public function write($sessionId, $data)
 125      {
 126          $this->getCollection()->update(
 127              array($this->options['id_field'] => $sessionId),
 128              array('$set' => array(
 129                  $this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY),
 130                  $this->options['time_field'] => new \MongoDate(),
 131              )),
 132              array('upsert' => true, 'multiple' => false)
 133          );
 134   
 135          return true;
 136      }
 137   
 138      /**
 139       * {@inheritdoc}
 140       */
 141      public function read($sessionId)
 142      {
 143          $dbData = $this->getCollection()->findOne(array(
 144              $this->options['id_field'] => $sessionId,
 145          ));
 146   
 147          return null === $dbData ? '' : $dbData[$this->options['data_field']]->bin;
 148      }
 149   
 150      /**
 151       * Return a "MongoCollection" instance
 152       *
 153       * @return \MongoCollection
 154       */
 155      private function getCollection()
 156      {
 157          if (null === $this->collection) {
 158              $this->collection = $this->mongo->selectCollection($this->options['database'], $this->options['collection']);
 159          }
 160   
 161          return $this->collection;
 162      }
 163  }
 164