Source for file UserSession.class.php

Documentation is available at UserSession.class.php

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

Documentation generated on Mon, 17 Sep 2007 13:33:40 +0300 by phpDocumentor 1.4.0a2