Advertisement
Redee

SessionR

Feb 12th, 2014
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.18 KB | None | 0 0
  1. <?
  2. /**
  3.  * Настраиваемая сессия.
  4.  * ©2014 Developed by Redee
  5.  */
  6.  
  7. class SessionR
  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 SessionR::setNewParams()}
  38.      */
  39.     private $coo_lifetime = 2592000;
  40.  
  41.     /**
  42.      * @var int Время жизни сессии на сервере в секундах.
  43.      * Для {@link SessionR::setNewParams()}
  44.      */
  45.     private $sess_lifetime = 2592000;
  46.    
  47.     /**
  48.      * @var mixed Название сессии от которого
  49.      * зависит место ее сохранения и чтения.
  50.      * Для {@link SessionR::setNewParams()}
  51.      */
  52.     private $sess_name='main_sessionR';
  53.  
  54.     /**
  55.      * @var mixed Название сайта/домена от которого
  56.      * зависит место сохранения и чтения сессии.
  57.      * Для {@link SessionR::setNewParams()}
  58.      */
  59.     private $site;
  60.  
  61.     /** @var bool Метка сессии SessionR */
  62.     private $active_sessionR = false;
  63.  
  64.     /**
  65.      * @param int $cs_lt
  66.      * Задает время жизни куки и сессии в секундах {@link sessionR::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 SessionR::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ый аргументы в SessionR.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).'_sessionR';
  106.         }
  107.         else
  108.             exit ('Допустимый 2ой аргумент в SessionR.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ий аргумент в SessionR.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_sessionR = true;
  131.     }
  132.  
  133.     /**
  134.      * @param string $old_or_new
  135.      * 'old' / 'new' - определяет массив для сохранения параметров сессии.
  136.      *
  137.      * @return void Сохраняет текущие параметры сессии в
  138.      * {@link SessionR::sess_old_params}
  139.      * или в {@link SessionR::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 ("Допустимые аргументы в SessionR.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.        
  167.         ini_restore('session.save_path');
  168.         ini_set(
  169.             'session.save_path',
  170.             ini_get('session.save_path').
  171.             $this->site.'/'.$this->sess_name.'/'
  172.         );
  173.        
  174.         ini_set('session.cookie_lifetime', $this->coo_lifetime);
  175.         ini_set('session.cookie_path', '/');
  176.         ini_set('session.cookie_httponly', 1);
  177.        
  178.         ini_set('session.gc_maxlifetime', $this->sess_lifetime);
  179.         ini_set('session.gc_probability', 1);
  180.         ini_set('session.gc_divisor', 1000);
  181.        
  182.         ini_set('session.name', $this->sess_name.'_id');
  183.     }
  184.  
  185.     /**
  186.      * Завершаем свою сессию, обновляем время жизни куки,
  187.      * возвращаем начальные параметры
  188.      * {@link SessionR::sess_old_params}
  189.      */
  190.     public function end()
  191.     {
  192.         if($this->active_sessionR == true and
  193.             session_status() == PHP_SESSION_ACTIVE)
  194.         {
  195.             session_commit();
  196.             $this->active_sessionR = false;
  197.            
  198.             if($this->sess_new_params['session.cookie_lifetime'] == 0)
  199.                 $time = 0;
  200.             else
  201.                 $time = time() + $this->sess_new_params['session.cookie_lifetime'];
  202.             setcookie ($this->sess_new_params['session.name'],
  203.                 session_id(), $time);
  204.            
  205.             foreach ($this->sess_old_params as $k => $v)
  206.             {
  207.                 ini_set($k,$v);
  208.             }
  209.         }
  210.         else echo 'Невозможно завершить сессию - нет активной сессии SessionR';
  211.     }
  212.  
  213.     /**
  214.      * Корректное удаление сессии и куки у клиента,
  215.      * возвращаем начальные параметры
  216.      */
  217.     public function destroy()
  218.     {
  219.         if($this->active_sessionR == true and
  220.         session_status() == PHP_SESSION_ACTIVE)
  221.         {
  222.             session_destroy();
  223.             setcookie($this->sess_new_params['session.name'],'',1);
  224.             $this->active_sessionR = false;
  225.            
  226.             foreach($this->sess_old_params as $k=>$v)
  227.             {
  228.                 ini_set($k,$v);
  229.             }
  230.         }
  231.         else echo 'Невозможно удалить сессию - нет активной сессии SessionR';
  232.     }
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement