<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.session.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'class.sessionhandler.php',
    1 => 'SessionHandler',
    2 => 'Класс SessionHandler',
  ),
  'up' => 
  array (
    0 => 'book.session.php',
    1 => 'Сессии',
  ),
  'prev' => 
  array (
    0 => 'function.session-write-close.php',
    1 => 'session_write_close',
  ),
  'next' => 
  array (
    0 => 'sessionhandler.close.php',
    1 => 'SessionHandler::close',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/session/sessionhandler.xml',
  ),
  'history' => 
  array (
  ),
  'extra_header_links' => 
  array (
    'rel' => 'alternate',
    'href' => '/manual/en/feeds/class.sessionhandler.atom',
    'type' => 'application/atom+xml',
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="class.sessionhandler" class="reference">

 <h1 class="title">Класс SessionHandler</h1>
 

 <div class="partintro"><p class="verinfo">(PHP 5 &gt;= 5.4.0, PHP 7, PHP 8)</p>

  
  <div class="section" id="sessionhandler.intro">
   <h2 class="title">Введение</h2>
   <p class="para">
    <span class="classname"><strong class="classname">SessionHandler</strong></span> это специальный класс, который может использоваться для
    дополнения внутреннего обработчика сессий PHP путём создания дочерних классов от этого.
    Существует семь методов, которые являются обёртками над семью внутренними обработчиками хранения
    данных сессии (<code class="parameter">open</code>, <code class="parameter">close</code>, <code class="parameter">read</code>,
    <code class="parameter">write</code>, <code class="parameter">destroy</code>, <code class="parameter">gc</code> и
    <code class="parameter">create_sid</code>). По умолчанию этот класс оборачивает все внутренние
    обработчики хранения сессии, определённые в опции конфигурации <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>.
    Эта опция по умолчанию имеет значение <code class="parameter">files</code>.
    Другие внутренние обработчики сессий предоставляются PHP-модулями, такими как
    SQLite (<code class="parameter">sqlite</code>), Memcache (<code class="parameter">memcache</code>)
    и Memcached (<code class="parameter">memcached</code>).
   </p>
   <p class="para">
    Экземпляр класса <span class="classname"><strong class="classname">SessionHandler</strong></span> может устанавливаться в
    качестве обработчика сессии посредством вызова функции <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>.
    В этом случае он станет обёрткой существующего внутреннего обработчика.
    Классы, расширяющие <span class="classname"><strong class="classname">SessionHandler</strong></span> позволят переопределить
    методы обработчика сессии или перехватить/отфильтровать их путём вызова
    родительских методов-обёрток внутреннего обработчика сессий PHP.
   </p>
   <p class="para">
    Это позволит вам, к примеру, перехватить методы <code class="parameter">read</code> и
    <code class="parameter">write</code> для шифровки/дешифровки данных сессии и передачи
    результата родительскому классу и от него. Или, к примеру, вы можете полностью
    переопределить такой метод как callback-функция сборщика мусора (<code class="parameter">gc</code>).
   </p>
   <p class="para">
    Так как <span class="classname"><strong class="classname">SessionHandler</strong></span> является обёрткой над стандартным
    внутренним обработчиком сессии, то пример, приведённый выше про шифровку данных
    может быть применён к любому внутреннему обработчику сессии даже без понимания
    внутреннего устройства процесса работы сессии.
   </p>
   <p class="para">
    Для использования этого класса, во-первых, установите обработчик, который вы хотите
    дополнить используя <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>.
    Далее передайте экземпляр класса <span class="classname"><strong class="classname">SessionHandler</strong></span> или одного из
    классов, расширяющих его функции <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>.
   </p>
   <p class="para">
    Обратите внимание, что callback-методы этого класса предназначены для внутреннего вызова PHP
    и не предназначены для вызова из кода пользовательского пространства.
    Возвращаемые значения одинаково обрабатываются внутри PHP.
    Дополнительную информацию о работе с сессией можно узнать
    из описания функции <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>.
   </p>
  </div>
  

  <div class="section" id="sessionhandler.synopsis">
   <h2 class="title">Обзор класса</h2>


   <div class="classsynopsis"><div class="classsynopsisinfo">
    
     <span class="modifier">class</span> <strong class="classname"><strong class="classname">SessionHandler</strong></strong>
    

    
     <span class="modifier">implements</span>
      <a href="class.sessionhandlerinterface.php" class="interfacename">SessionHandlerInterface</a>,

     <a href="class.sessionidinterface.php" class="interfacename">SessionIdInterface</a> {</div>

    <div class="classsynopsisinfo classsynopsisinfo_comment">/* Методы */</div>
    <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.close.php" class="methodname">close</a></span>(): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.create-sid.php" class="methodname">create_sid</a></span>(): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.destroy.php" class="methodname">destroy</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$id</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.gc.php" class="methodname">gc</a></span>(<span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$max_lifetime</code></span>): <span class="type"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.open.php" class="methodname">open</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$path</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$name</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.read.php" class="methodname">read</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$id</code></span>): <span class="type"><span class="type"><a href="language.types.string.php" class="type string">string</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.write.php" class="methodname">write</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$id</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$data</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

   }</div>


  </div>

  <div class="section" id="session.notes">
   <h2 class="title">Примечания</h2>
   <div class="warning"><strong class="warning">Внимание</strong>
    <p class="para">
     Этот класс предназначен для расширения текущего внутреннего обработчика сессии PHP.
     При этом, если вам нужно написать собственный обработчик, то необходимо написать
     собственную реализацию интерфейса <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span>
     вместо расширения класса <span class="classname"><strong class="classname">SessionHandler</strong></span>.
    </p>
   </div>
  </div>

  <div class="section" id="sessionhandler.examples">
   <h2 class="title">Примеры</h2>
   <div class="example" id="example-1">
    <p><strong>Пример #1 
     Пример использования класса <span class="classname"><strong class="classname">SessionHandler</strong></span> для добавления
     шифрования внутренним обработчикам сохранения PHP
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /> </span><span style="color: #FF8000">/**<br />  * Расшифровать данные алгоритмом AES 256<br />  *<br />  * @param data $edata<br />  * @param string $password<br />  * @return расшифрованные данные<br />  */<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">decrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$edata</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">base64_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$edata</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$salt </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">16</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$ct </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">16</span><span style="color: #007700">);<br /><br />    </span><span style="color: #0000BB">$rounds </span><span style="color: #007700">= </span><span style="color: #0000BB">3</span><span style="color: #007700">; </span><span style="color: #FF8000">// Зависит от длины ключа<br />    </span><span style="color: #0000BB">$data00 </span><span style="color: #007700">= </span><span style="color: #0000BB">$password</span><span style="color: #007700">.</span><span style="color: #0000BB">$salt</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$hash </span><span style="color: #007700">= array();<br />    </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">] = </span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">'sha256'</span><span style="color: #007700">, </span><span style="color: #0000BB">$data00</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br />    for (</span><span style="color: #0000BB">$i </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #0000BB">$i </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">$rounds</span><span style="color: #007700">; </span><span style="color: #0000BB">$i</span><span style="color: #007700">++) {<br />        </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">] = </span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">'sha256'</span><span style="color: #007700">, </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">$i </span><span style="color: #007700">- </span><span style="color: #0000BB">1</span><span style="color: #007700">].</span><span style="color: #0000BB">$data00</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />        </span><span style="color: #0000BB">$result </span><span style="color: #007700">.= </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">];<br />    }<br />    </span><span style="color: #0000BB">$key </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$iv  </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">,</span><span style="color: #0000BB">16</span><span style="color: #007700">);<br /><br />    return </span><span style="color: #0000BB">openssl_decrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ct</span><span style="color: #007700">, </span><span style="color: #DD0000">'AES-256-CBC'</span><span style="color: #007700">, </span><span style="color: #0000BB">$key</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv</span><span style="color: #007700">);<br />  }<br /><br /></span><span style="color: #FF8000">/**<br /> * Зашифровать данные алгоритмом AES 256<br /> *<br /> * @param data $data<br /> * @param string $password<br /> * @return base64 зашифрованные данные<br /> */<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">encrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Генерация криптографически безопасной случайной соли функцией random_bytes()<br />    </span><span style="color: #0000BB">$salt </span><span style="color: #007700">= </span><span style="color: #0000BB">random_bytes</span><span style="color: #007700">(</span><span style="color: #0000BB">16</span><span style="color: #007700">);<br /><br />    </span><span style="color: #0000BB">$salted </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$dx </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">;<br />    </span><span style="color: #FF8000">// Ключ соли (32) и вектор инициализации (16) = 48<br />    </span><span style="color: #007700">while (</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$salted</span><span style="color: #007700">) &lt; </span><span style="color: #0000BB">48</span><span style="color: #007700">) {<br />      </span><span style="color: #0000BB">$dx </span><span style="color: #007700">= </span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">'sha256'</span><span style="color: #007700">, </span><span style="color: #0000BB">$dx</span><span style="color: #007700">.</span><span style="color: #0000BB">$password</span><span style="color: #007700">.</span><span style="color: #0000BB">$salt</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$salted </span><span style="color: #007700">.= </span><span style="color: #0000BB">$dx</span><span style="color: #007700">;<br />    }<br /><br />    </span><span style="color: #0000BB">$key </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$salted</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$iv  </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$salted</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">,</span><span style="color: #0000BB">16</span><span style="color: #007700">);<br /><br />    </span><span style="color: #0000BB">$encrypted_data </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_encrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #DD0000">'AES-256-CBC'</span><span style="color: #007700">, </span><span style="color: #0000BB">$key</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv</span><span style="color: #007700">);<br />    return </span><span style="color: #0000BB">base64_encode</span><span style="color: #007700">(</span><span style="color: #0000BB">$salt </span><span style="color: #007700">. </span><span style="color: #0000BB">$encrypted_data</span><span style="color: #007700">);<br />}<br /><br />class </span><span style="color: #0000BB">EncryptedSessionHandler </span><span style="color: #007700">extends </span><span style="color: #0000BB">SessionHandler<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$key</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key </span><span style="color: #007700">= </span><span style="color: #0000BB">$key</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">read</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">read</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">);<br /><br />        if (!</span><span style="color: #0000BB">$data</span><span style="color: #007700">) {<br />            return </span><span style="color: #DD0000">""</span><span style="color: #007700">;<br />        } else {<br />            return </span><span style="color: #0000BB">decrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key</span><span style="color: #007700">);<br />        }<br />    }<br /><br />    public function </span><span style="color: #0000BB">write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">encrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key</span><span style="color: #007700">);<br /><br />        return </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Здесь мы перехватываем встроенный обработчик 'files', но можно использовать любой другой<br />// обработчик, например 'sqlite', 'memcache' или 'memcached',<br />// которые предлагают модули PHP<br /></span><span style="color: #0000BB">ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">'session.save_handler'</span><span style="color: #007700">, </span><span style="color: #DD0000">'files'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$key </span><span style="color: #007700">= </span><span style="color: #DD0000">'secret_string'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$handler </span><span style="color: #007700">= new </span><span style="color: #0000BB">EncryptedSessionHandler</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">session_set_save_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$handler</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">session_start</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Устанавливаем и получаем значения из $_SESSION<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     Поскольку методы этого класса предназначены для внутренних вызовов из PHP как часть
     нормального процесса работы сессий, вызовы родительских методов из дочернего класса
     (иными словами «родных» обработчиков) будет возвращать <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> до тех пор,
     пока сессия не будет запущена (автоматически или прямым вызовом функции <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span>).
     Это важный момент для понимания, особенно при тестировании, где методы класса
     могут вызываться вручную.
    </p>
   </p></blockquote>
  </div>

 </div>

 










































<h2>Содержание</h2><ul class="chunklist chunklist_reference"><li><a href="sessionhandler.close.php">SessionHandler::close</a> — Закрывает сессию</li><li><a href="sessionhandler.create-sid.php">SessionHandler::create_sid</a> — Возвращает новый идентификатор сессии</li><li><a href="sessionhandler.destroy.php">SessionHandler::destroy</a> — Уничтожает сессию</li><li><a href="sessionhandler.gc.php">SessionHandler::gc</a> — Очищает старые сессии</li><li><a href="sessionhandler.open.php">SessionHandler::open</a> — Инициализирует сессию</li><li><a href="sessionhandler.read.php">SessionHandler::read</a> — Считывает данные сессии</li><li><a href="sessionhandler.write.php">SessionHandler::write</a> — Записывает данные сессии</li></ul>
</div>
<?php manual_footer($setup); ?>