energine
[ class tree: energine ] [ index: energine ] [ all elements ]

Source for file UserSession.class.php

Documentation is available at UserSession.class.php

  1. <?php
  2.  
  3. /**
  4.  * Класс UserSession.
  5.  *
  6.  * @package energine
  7.  * @subpackage core
  8.  * @author dr.Pavka
  9.  * @copyright Energine 2006
  10.  * @version $Id$
  11.  */
  12.  
  13. /**
  14.  * Класс управления сеансами пользователей.
  15.  *
  16.  * @package energine
  17.  * @subpackage core
  18.  * @author dr.Pavka
  19.  * @final
  20.  */
  21. final class UserSession extends DBWorker {
  22.  
  23.     /**
  24.      * Имя сеанса по-умолчанию.
  25.      */
  26.     const DEFAULT_SESSION_NAME = 'NRGNSID';
  27.  
  28.     /**
  29.      * Вероятность вызова сборщика мусора.
  30.      * Вычисляется как DEFAULT_PROBABILITY / session.gc_divisor (defaults to 100).
  31.      * Например, 10 / 100 означает 10%-вероятность вызова СМ.
  32.      */
  33.     const DEFAULT_PROBABILITY = 10;
  34.  
  35.     /**
  36.      * @access private
  37.      * @var string идентификатор сеанса
  38.      */
  39.     private $phpSessId;
  40.  
  41.     /**
  42.      * @access private
  43.      * @var int идентификатор сеанса в БД
  44.      */
  45.     private $id = false;
  46.  
  47.     /**
  48.      * Если период между запросами превышает эту величину, сеанс становится недействительным.
  49.      *
  50.      * @var int время ожидания
  51.      * @access private
  52.      */
  53.     private $timeout;
  54.  
  55.     /**
  56.      * Используется для настройки времени жизни cookie и сборки мусора.
  57.      *
  58.      * @var int максимальное время жизни сеанса
  59.      * @access private
  60.      */
  61.     private $lifespan;
  62.  
  63.     /**
  64.      * @access private
  65.      * @static
  66.      * @var UserSession единый для всей системы экземпляр класса UserSession
  67.      */
  68.     private static $instance;
  69.  
  70.     /**
  71.      * @access private
  72.      * @var string пользовательский агент
  73.      */
  74.     private $userAgent;
  75.  
  76.     /**
  77.      * @access private
  78.      * @var string имя сеанса
  79.      */
  80.     private $name;
  81.  
  82.     /**
  83.      * @access private
  84.      * @var string имя таблицы сеансов в БД
  85.      */
  86.     private $tableName;
  87.     
  88.     private $dataCache;
  89.  
  90.     /**
  91.      * Конструктор класса.
  92.      *
  93.      * @access private
  94.      * @return void 
  95.      */
  96.     public function __construct({
  97.         parent::__construct();
  98.         $this->timeout = $this->getConfigValue('session.timeout');
  99.         $this->lifespan = $this->getConfigValue('session.lifespan');
  100.         $this->userAgent = isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:'ROBOT';
  101.         $this->name = self::DEFAULT_SESSION_NAME;
  102.         $this->tableName = 'share_session';
  103.         $this->dataCache = '';
  104.         ini_set('session.gc_probability'self::DEFAULT_PROBABILITY);
  105.  
  106.         // устанавливаем обработчики сеанса
  107.         session_set_save_handler(
  108.             array(&$this'open'),
  109.             array(&$this'close'),
  110.             array(&$this'read'),
  111.             array(&$this'write'),
  112.             array(&$this'destroy'),
  113.             array(&$this'gc')
  114.         );
  115.         //register_shutdown_function('session_write_close');
  116.  
  117.         session_name($this->name);
  118.  
  119.         // устанавливаем время жизни cookie
  120.         session_set_cookie_params($this->lifespan$this->getConfigValue('site.root'));
  121.         
  122.         // проверяем существование cookie и корректность его данных
  123.         if (isset($_COOKIE[$this->name])) {
  124.             $this->phpSessId = $_COOKIE[$this->name];
  125.             // проверяем, действителен ли текущий сеанс
  126.             $res $this->dbh->selectRequest(
  127.                 "SELECT session_id FROM {$this->tableName}".
  128.                 ' WHERE session_native_id = %s'.
  129.                 ' AND (NOW() - session_created) < %s'.
  130.                 ' AND (NOW() - session_last_impression) <= %s'.
  131.                 ' AND session_user_agent = %s',
  132.                 $this->phpSessId,
  133.                 $this->lifespan,
  134.                 $this->timeout,
  135.                 $this->
  136.             );
  137.             $response Response::getInstance();
  138.             if (is_array($res)) {
  139.                 $response->setCookie(
  140.                     $this->name,
  141.                     $this->phpSessId,
  142.                     (time($this->lifespan),
  143.                     $this->getConfigValue('site.root')
  144.                 );
  145.             }
  146.             else {
  147.                 $this->dbh->modify(QAL::DELETE$this->tableNamenull"session_native_id = '{$this->phpSessId}'");
  148.                 // удаляем cookie сеанса
  149.                 $response->deleteCookie($this->name$this->getConfigValue('site.root'));
  150.             }
  151.         }
  152.         session_start();
  153.     }
  154.  
  155.     /**
  156.      * Возвращает единый для всей системы экземпляр класса UserSession.
  157.      *
  158.      * @access public
  159.      * @static
  160.      * @return UserSession
  161.      */
  162.     public static function getInstance() {
  163.         if (!isset(self::$instance)) {
  164.             self::$instance = new UserSession;
  165.         }
  166.         return self::$instance;
  167.     }
  168.  
  169.     /**
  170.      * Открывает сеанс.
  171.      *
  172.      * @access public
  173.      * @param string $savePath
  174.      * @param string $sessionName
  175.      * @return boolean
  176.      */
  177.     public function open($savePath, $sessionName) {
  178.         return true;
  179.     }
  180.  
  181.     /**
  182.      * Закрывает сеанс.
  183.      *
  184.      * @access public
  185.      * @return bool
  186.      */
  187.     public function close() {
  188.         return true;
  189.     }
  190.  
  191.     /**
  192.      * Читает данные сеанса.
  193.      * Поскольку данный метод вызыватся сразу же после установки
  194.      * идентификатора сеанса, он используется вместо метода open.
  195.      *
  196.      * @access public
  197.      * @param string идентификатор сеанса
  198.      * @return mixed
  199.      */
  200.     public function read($phpSessId) {
  201.         $result = '';
  202.         
  203.         $this->phpSessId = $phpSessId;
  204.  
  205.         $res $this->dbh->select(
  206.             $this->tableName,
  207.             array('session_id''session_data'),
  208.             array('session_native_id' => $this->phpSessId)
  209.         );
  210.  
  211.         // если указанный сеанс существует в БД
  212.         if (is_array($res)) {
  213.             $res = $res[0];
  214.             $this->id = $res['session_id'];
  215.             $result $res['session_data'];
  216.         }
  217.         // если такого сеанса в БД не существует
  218.         else {
  219.             try {
  220.                 // создаем новую запись сеанса
  221.                 $this->id = $this->dbh->modifyRequest(
  222.                     "INSERT INTO {$this->tableName} (session_native_id, session_created, session_user_agent) VALUES(%s, NOW(), %s)",
  223.                     $this->phpSessId$this->
  224.                 );
  225.             }
  226.             catch (Exception $e){
  227.                 
  228.             }
  229.         }
  230.   
  231.         return $result;
  232.     }
  233.  
  234.     /**
  235.      * Записывает данные сеанса.
  236.      *
  237.      * @access public
  238.      * @param string идентификатор сеанса
  239.      * @param mixed данные
  240.      * @return mixed
  241.      */
  242.     public function write($phpSessId, $data) {
  243.         $this->dbh->modify(QAL::UPDATE$this->tableNamearray('session_data' => $data)array('session_native_id' => $phpSessId));
  244.         return true;
  245.     }
  246.  
  247.     /**
  248.      * Уничтожает сеанс.
  249.      *
  250.      * @access public
  251.      * @param string идентификатор сеанса
  252.      * @return bool
  253.      */
  254.     public function destroy($phpSessId) {
  255.         return $this->dbh->modify(QAL::DELETE$this->tableNamenullarray('session_native_id' => $phpSessId));
  256.     }
  257.  
  258.     /**
  259.      * Сборщик мусора.
  260.      *
  261.      * @access public
  262.      * @param int максимальное время жизни сеанса
  263.      * @return bool
  264.      */
  265.     public function gc($maxLifeTime) {
  266.         $this->dbh->modify(
  267.             QAL::DELETE
  268.             $this->tableName
  269.             null
  270.             '((NOW() - session_created) > '.$this->lifespan.') OR ((NOW() - session_last_impression) > '.$this->timeout.')'
  271.         );
  272.         return true;
  273.     }
  274.  
  275.     /**
  276.      * Стартует сеанс.
  277.      *
  278.      * @access public
  279.      * @return void
  280.      */
  281.     public function start() {
  282.         if ($this->phpSessId{
  283.             $this->dbh->modifyRequest('UPDATE '.$this->tableName.' SET session_last_impression = NOW() WHERE session_native_id = %s'$this->phpSessId);
  284.         }
  285.     }
  286.  
  287.     /**
  288.      * Возвращает идентификатор сеанса.
  289.      *
  290.      * @access public
  291.      * @return int
  292.      */
  293.     public function getID() {
  294.         return $this->id;
  295.     }
В создании документации нам помог: phpDocumentor