Advertisement
Redee

SessR

May 21st, 2014
423
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.11 KB | None | 0 0
  1. <?
  2. /**
  3.  * Настраиваемая сессия.
  4.  * ©2014 Developed by Redee
  5.  */
  6.  
  7. class Session
  8. {
  9.     /** @var array Необходимые параметры сессии */
  10.     private $sess_params = [
  11.         'session.use_cookies',
  12.         'session.use_only_cookies',
  13.         'session.use_trans_sid',
  14.         'session.save_handler',
  15.        
  16.         'session.save_path',
  17.        
  18.         'session.cookie_lifetime',
  19.         'session.cookie_path',
  20.         'session.cookie_httponly',
  21.        
  22.         'session.gc_maxlifetime',
  23.         'session.gc_probability',
  24.         'session.gc_divisor',
  25.        
  26.         'session.name',
  27.     ];
  28.    
  29.     /** @var array Хранятся начальные параметры сессии */
  30.     private $sess_old_params = [];
  31.    
  32.     /** @var array Хранятся свои параметры сессии */
  33.     private $sess_new_params = [];
  34.    
  35.     /**
  36.      * @var int Время жизни куки у клиента в секундах.
  37.      * Для {@link session::setNewParams()}
  38.      */
  39.     private $coo_lifetime = 2592000;
  40.  
  41.     /**
  42.      * @var int Время жизни сессии на сервере в секундах.
  43.      * Для {@link session::setNewParams()}
  44.      */
  45.     private $sess_lifetime = 2592000;
  46.    
  47.     /**
  48.      * @var mixed Название сессии от которого
  49.      * зависит место ее сохранения и чтения.
  50.      * Для {@link session::setNewParams()}
  51.      */
  52.     private $sess_name='main_session';
  53.  
  54.     /**
  55.      * @var mixed Название сайта/домена от которого
  56.      * зависит место сохранения и чтения сессии.
  57.      * Для {@link session::setNewParams()}
  58.      */
  59.     private $site;
  60.  
  61.     /** @var bool Метка сессии session */
  62.     private $active_session = false;
  63.  
  64.     /**
  65.      * @param int $cs_lt
  66.      * Задает время жизни куки и сессии в секундах {@link session::coo_sess_lifetime}
  67.      * По умолчанию 2592000 = 30 дней,
  68.      * 0 = до закрытия браузера.
  69.      *
  70.      * @param string $se_n Название сессии =
  71.      * имя 2ой папки сохранения и чтения.
  72.      * По умолчанию = 'main'.
  73.      *
  74.      * @param string $st_n Название сайта =
  75.      * имя 1ой папки сохранения и чтения сессии.
  76.      * По умолчанию = null задает {@link session::site} = $_SERVER['HTTP_HOST']
  77.      */
  78.     public function run($cs_lt = 2592000, $se_n='main', $st_n = null)
  79.     {
  80.         if(session_status() == PHP_SESSION_ACTIVE)
  81.             session_commit();
  82.         $this->saveParams('old');
  83.        
  84.         if ($cs_lt == 2592000)
  85.         {}
  86.         elseif ($cs_lt == 0)
  87.         {
  88.             $this->coo_lifetime = $cs_lt;
  89.             $this->sess_lifetime = 1440;
  90.         }
  91.         elseif (is_int($cs_lt) and $cs_lt > 1339)
  92.         {
  93.             $this->coo_lifetime = $cs_lt;
  94.             $this->sess_lifetime = $cs_lt;
  95.         }
  96.         else
  97.             exit ('Допустимый 1ый аргументы в session.run() - число: 0 (кука сессии до закрытия браузера, сессия на сервере гарантировано 24 минуты) / более 1339 секунд (кука сессии от 24 минут, сессия на сервере гарантировано от 24 минут)');
  98.        
  99.         if ($se_n == 'main')
  100.         {}
  101.         elseif ($se_n != 'main' and
  102.             preg_match('/[\S]/',$se_n) == 1 and
  103.             preg_match('/["?*:><|\/\\\]/',$st_n) == 0)
  104.         {
  105.             $this->sess_name = trim($se_n).'_session';
  106.         }
  107.         else
  108.             exit ('Допустимый 2ой аргумент в session.run() должен иметь хотя бы 1 не пробельный символ, кроме "?*:><|/\\');
  109.        
  110.         if($st_n == null)
  111.         {
  112.             $this->site = $_SERVER['HTTP_HOST'];
  113.         }
  114.         elseif($st_n != null and
  115.             preg_match('/[\S]/',$st_n)==1 and
  116.             preg_match('/["?*:><|\/\\\]/',$st_n)==0)
  117.         {
  118.             $this->site = trim($st_n);
  119.         }
  120.         else
  121.             exit('Допустимый 3ий аргумент в session.run() должен иметь хотя бы 1 не пробельный символ, кроме "?*:><|/\\');
  122.        
  123.         $this->setNewParams();
  124.        
  125.         $this->saveParams('new');
  126.        
  127.         if(!is_dir($this->sess_new_params['session.save_path']))
  128.             mkdir($this->sess_new_params['session.save_path'], 0777, true);
  129.         session_start();
  130.         $this->active_session = true;
  131.     }
  132.  
  133.     /**
  134.      * @param string $old_or_new
  135.      * 'old' / 'new' - определяет массив для сохранения параметров сессии.
  136.      *
  137.      * @return void Сохраняет текущие параметры сессии в
  138.      * {@link session::sess_old_params}
  139.      * или в {@link session::sess_new_params}
  140.      */
  141.     private function saveParams($old_or_new)
  142.     {
  143.         if ($old_or_new == 'old')
  144.             $name = 'sess_old_params';
  145.         elseif ($old_or_new == 'new')
  146.             $name = 'sess_new_params';
  147.         else
  148.             exit ("Допустимые аргументы в session.saveParams() > 'old' / 'new'");
  149.        
  150.         foreach ($this->sess_params as $v)
  151.         {
  152.             $this->{$name}[$v] = ini_get($v);
  153.         }
  154.     }
  155.  
  156.     /**
  157.      * Назначаем новые параметры сессии.
  158.      * Сборщик мусора с шансом запуска 1 из 1000 раз session_start();
  159.      */
  160.     private function setNewParams()
  161.     {
  162.         ini_set('session.use_cookies', 1);
  163.         ini_set('session.use_only_cookies', 1);
  164.         ini_set('session.use_trans_sid', 0);
  165.         ini_set('session.save_handler', 'files');
  166.         ini_set('session.save_path',
  167.             get_cfg_var('session.save_path').
  168.             $this->site.'/'.$this->sess_name.'/');
  169.        
  170.         ini_set('session.cookie_lifetime', $this->coo_lifetime);
  171.         ini_set('session.cookie_path', '/');
  172.         ini_set('session.cookie_httponly', 1);
  173.        
  174.         ini_set('session.gc_maxlifetime', $this->sess_lifetime);
  175.         ini_set('session.gc_probability', 1);
  176.         ini_set('session.gc_divisor', 1000);
  177.        
  178.         ini_set('session.name', $this->sess_name.'_id');
  179.     }
  180.  
  181.     /**
  182.      * Завершаем свою сессию, обновляем время жизни куки,
  183.      * возвращаем начальные параметры
  184.      * {@link session::sess_old_params}
  185.      */
  186.     public function end()
  187.     {
  188.         if($this->active_session == true and
  189.             session_status() == PHP_SESSION_ACTIVE)
  190.         {
  191.             session_commit();
  192.             $this->active_session = false;
  193.            
  194.             if($this->sess_new_params['session.cookie_lifetime'] == 0)
  195.                 $time = 0;
  196.             else
  197.                 $time = time() + $this->sess_new_params['session.cookie_lifetime'];
  198.             setcookie ($this->sess_new_params['session.name'],
  199.                 session_id(), $time);
  200.            
  201.             foreach ($this->sess_old_params as $k => $v)
  202.             {
  203.                 ini_set($k,$v);
  204.             }
  205.         }
  206.         else echo 'Невозможно завершить сессию - нет активной сессии session';
  207.     }
  208.  
  209.     /**
  210.      * Корректное удаление сессии и куки у клиента,
  211.      * возвращаем начальные параметры
  212.      */
  213.     public function destroy()
  214.     {
  215.         if($this->active_session == true and
  216.         session_status() == PHP_SESSION_ACTIVE)
  217.         {
  218.             session_destroy();
  219.             setcookie($this->sess_new_params['session.name'],'',1);
  220.             $this->active_session = false;
  221.            
  222.             foreach($this->sess_old_params as $k=>$v)
  223.             {
  224.                 ini_set($k,$v);
  225.             }
  226.         }
  227.         else echo 'Невозможно удалить сессию - нет активной сессии session';
  228.     }
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement