<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.session.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'function.session-set-save-handler.php',
    1 => 'session_set_save_handler',
    2 => 'Устанавливает пользовательские обработчики хранения сессии',
  ),
  'up' => 
  array (
    0 => 'ref.session.php',
    1 => 'Функции для работы с сессиями',
  ),
  'prev' => 
  array (
    0 => 'function.session-set-cookie-params.php',
    1 => 'session_set_cookie_params',
  ),
  'next' => 
  array (
    0 => 'function.session-start.php',
    1 => 'session_start',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/session/functions/session-set-save-handler.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.session-set-save-handler" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">session_set_save_handler</h1>
  <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">session_set_save_handler</span> &mdash; <span class="dc-title">Устанавливает пользовательские обработчики хранения сессии</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-function.session-set-save-handler-description">
  <h3 class="title">Описание</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>session_set_save_handler</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$open</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$close</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$read</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$write</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$destroy</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$gc</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$create_sid</code><span class="initializer"> = ?</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$validate_sid</code><span class="initializer"> = ?</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$update_timestamp</code><span class="initializer"> = ?</span></span><br>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

  <p class="para rdfs-comment">
   Также возможно зарегистрировать следующий прототип:
  </p>
  <div class="methodsynopsis dc-description"><span class="methodname"><strong>session_set_save_handler</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.object.php" class="type object">object</a></span> <code class="parameter">$sessionhandler</code></span>, <span class="methodparam"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> <code class="parameter">$register_shutdown</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></span></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

  <p class="para rdfs-comment">
   <span class="function"><strong>session_set_save_handler()</strong></span> устанавливает пользовательские
   обработчики хранения сессии, которые используются для сохранения
   и получения данных, связанных с сессией. Это особенно полезно, когда
   предпочтительным является метод хранения, отличный от тех, которые предоставляются
   сессиями PHP, например, хранение данных сессии в локальной базе данных.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.session-set-save-handler-parameters">
  <h3 class="title">Список параметров</h3>
  <p class="para">
   Данная функция имеет два определения (прототипа).
   <dl>
    
     <dt><code class="parameter">sessionhandler</code></dt>
     <dd>
      <p class="para">
       Экземпляр класса, реализующий интерфейс
       <span class="interfacename"><a href="class.sessionhandlerinterface.php" class="interfacename">SessionHandlerInterface</a></span> и необязательные
       <span class="interfacename"><a href="class.sessionidinterface.php" class="interfacename">SessionIdInterface</a></span> и/или
       <span class="interfacename"><a href="class.sessionupdatetimestamphandlerinterface.php" class="interfacename">SessionUpdateTimestampHandlerInterface</a></span>,
       такой как <span class="classname"><a href="class.sessionhandler.php" class="classname">SessionHandler</a></span>, для регистрации
       в качестве обработчика сессии.
      </p>
     </dd>
    
    
     <dt><code class="parameter">register_shutdown</code></dt>
     <dd>
      <p class="para">
       Зарегистрировать <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> как
       функцию <span class="function"><a href="function.register-shutdown-function.php" class="function">register_shutdown_function()</a></span>.
      </p>
     </dd>
    
   </dl>

   или

   <dl>
    
     <dt><code class="parameter">open</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">open</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$savePath</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$sessionName</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       Callback-функция <code class="parameter">open</code> работает как конструктор в классах и выполняется
       при открытии сессии. Это первая callback-функция, которая выполняется,
       когда сессия стартует автоматически либо вручную через <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span>.
       Возвращаемое значение <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> в случае успешного выполнения, <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> в случае неудачи.
      </p>
     </dd>
    
    
     <dt><code class="parameter">close</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">close</span></span>(): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       Callback-функция <code class="parameter">close</code> работает как деструктор в классах и выполняется
       после того, как была вызвана callback-функция <code class="parameter">write</code>. Она также вызывается
       при вызове <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span>.
       Возвращаемое значение должно быть <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> в случае успешного выполнения, <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> в случае неудачи.
      </p>
     </dd>
    
    
     <dt><code class="parameter">read</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">read</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$sessionId</code></span>): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>

      </p>
      <p class="para">
       Callback-функция <code class="parameter">read</code> должна всегда возвращать кодированную (сериализованную)
       строку сессии или пустую строку, если нет данных для чтения.
      </p>
      <p class="para">
       Эта callback-функция вызывается внутренним механизмом PHP при старте сессии или при вызове
       <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span>. Перед тем, как будет вызвана эта callback-функция,
       PHP вызовет callback-функцию <code class="parameter">open</code>.
      </p>
      <p class="para">
       Возвращаемое значение данной callback-функции должно быть в точно таком же сериализованном формате,
       который изначально передавался для хранения в callback-функцию <code class="parameter">write</code>. Возвращаемое
       значение будет автоматически десериализовано PHP и использовано для заполнения суперглобальной переменной
       <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>. Даже если данные похожи на результат <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span>, стоит
       помнить, что это другой формат сериализации, который определён ini-директивой <a href="session.configuration.php#ini.session.serialize-handler" class="link">session.serialize_handler</a>.
      </p>
     </dd>
    
    
     <dt><code class="parameter">write</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">write</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$sessionId</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>

      </p>
      <p class="para">
       Callback-функция <code class="parameter">write</code> вызывается, когда сессия должна быть сохранена и закрыта. Данная
       callback-функция принимает идентификатор текущей сессии и сериализованную версию суперглобальной переменной
       <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>. Используемый внутри PHP метод сериализации определён ini-директивой
       <a href="session.configuration.php#ini.session.serialize-handler" class="link">session.serialize_handler</a>.
      </p>
      <p class="para">
       Переданные в эту callback-функцию сериализованные данные сессии должны быть сохранены в связи с переданным
       идентификатором сессии. При получении этих данных, callback-функция <code class="parameter">read</code> должна вернуть
       то же самое значение, что было передано в callback-функцию <code class="parameter">write</code>.
      </p>
      <p class="para">
       Данная callback-функция вызывается, когда PHP завершает работу или явно при вызове <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span>.
       Следует помнить, что после выполнения этой callback-функции, PHP выполнит callback-функцию <code class="parameter">close</code>.
       <blockquote class="note"><p><strong class="note">Замечание</strong>: 
        <p class="para">
         Обработчик &quot;write&quot; не выполнится до тех пор, пока выходной поток не будет
         закрыт. Таким образом, вывод отладочных операторов в обработчике &quot;write&quot;
         никогда не отобразится в браузере. Если необходим вывод отладочной информации,
         рекомендуется записывать отладочные данные в файл.
        </p>
       </p></blockquote>
      </p>
     </dd>
    
    
     <dt><code class="parameter">destroy</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description">
        <span class="methodname"><span class="replaceable">destroy</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$sessionId</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       Данная callback-функция вызывается, когда сессия уничтожается с помощью <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span>
       или при вызове <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> с параметром destroy, установленным в <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
       Возвращаемое значение должно быть <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> в случае успешного выполнения, <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> в случае неудачи.
      </p>
     </dd>
    
    
     <dt><code class="parameter">gc</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">gc</span></span>(<span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$lifetime</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       Callback-функция сборщика мусора периодически вызывается PHP для очистки данных старых сессий.
       Частота контролируется директивами <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
       и <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a>. Значение lifetime, которое передаётся
       в данную callback-функцию может быть установлено в <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>.
       Возвращаемое значение должно быть <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> в случае успешного выполнения, <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> в случае неудачи.
      </p>
     </dd>
    
    
     <dt><code class="parameter">create_sid</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">create_sid</span></span>(): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>

      </p>
      <p class="para">
       Данная callback-функция выполняется, когда требуется новый идентификатор сессии. Не
       предусматривает параметров, а возвращаемое значение должно быть строкой, которая
       является допустимым идентификатором сессии для вашего обработчика.
      </p>
     </dd>
    
    
     <dt><code class="parameter">validate_sid</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">validate_sid</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$key</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       Callback-функция выполняется, когда должна быть запущена сессия, предоставляется идентификатор сессии
       и включается <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>.
       <code class="parameter">key</code> - это идентификатор сессии для проверки.
       Идентификатор сессии действителен, если сессия с таким идентификатором уже существует.
       Возвращаемое значение должно быть <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> в случае успешного выполнения или <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> в случае возникновения ошибки.
      </p>
     </dd>
    
    
     <dt><code class="parameter">update_timestamp</code></dt>
     <dd>
      <p class="para">
       Callback-функция со следующей сигнатурой:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">update_timestamp</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$key</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$val</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       Callback-функция выполняется при сессии.
       <code class="parameter">key</code> - это идентификатор сессии, <code class="parameter">val</code> - это данные сессии.
       Возвращаемое значение должно быть <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> в случае успешного выполнения или <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> в случае возникновения ошибки.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.session-set-save-handler-returnvalues">
  <h3 class="title">Возвращаемые значения</h3>
  <p class="para">
   Функция возвращает <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если выполнилась успешно, или <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, если возникла ошибка.
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.session-set-save-handler-examples">
  <h3 class="title">Примеры</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Пример #1 
     Пользовательский обработчик сессии: полный код смотрите в описании <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span>.
    </strong></p>
    <div class="example-contents"><p>
     Здесь только продемонстрирован вызов session_set_save_handler,
     полный пример можно посмотреть в описании <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span>.
    </p></div>
    <div class="example-contents"><p>
     Заметьте, что с <span class="function"><strong>session_set_save_handler()</strong></span> мы используем ООП-прототип и регистрируем
     функцию завершения, используя флаг параметра функции. Это обычно рекомендуется при регистрации
     объектов в качестве обработчиков хранения сессии.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MySessionHandler </span><span style="color: #007700">implements </span><span style="color: #0000BB">SessionHandlerInterface<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// здесь реализация интерфейса<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">$handler </span><span style="color: #007700">= new </span><span style="color: #0000BB">MySessionHandler</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</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 notes" id="refsect1-function.session-set-save-handler-notes">
  <h3 class="title">Примечания</h3>
  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="para">
    Обработчики <code class="parameter">write</code> и
    <code class="parameter">close</code> вызываются после деструктора объекта и
    поэтому не могут использовать его контекст или бросать исключения. Исключения
    не могут быть обработаны, так как не будут пойманы, не будет отражена трассировка
    стека исключения и выполнение просто прекратится неожиданно. Однако при этом, деструкторы
    объекта могут использовать сессии.
   </p>
   <p class="para">
    Можно вызвать <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> из деструктора, чтобы
    решить эту проблему &quot;курицы и яйца&quot;, но самый надёжный способ - это регистрировать
    функцию завершения, как описано выше.
   </p>
  </div>
  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="para">
    Текущий рабочий каталог изменяется некоторыми SAPI, если сессия закрывается при
    завершении скрипта. Завершить сессию можно раньше с помощью
    <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span>.
   </p>
  </div>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.session-set-save-handler-seealso">
  <h3 class="title">Смотрите также</h3>
  <p class="para">
   <ul class="simplelist">
    <li>
     Директива <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>
    </li>
    <li>
     Директива <a href="session.configuration.php#ini.session.serialize-handler" class="link">session.serialize_handler</a>
    </li>
    <li><span class="function"><a href="function.register-shutdown-function.php" class="function" rel="rdfs-seeAlso">register_shutdown_function()</a> - Регистрирует функцию, которая выполнится при завершении работы скрипта</span></li>
    <li><span class="function"><a href="function.session-register-shutdown.php" class="function" rel="rdfs-seeAlso">session_register_shutdown()</a> - Регистрирует функцию завершения сессии</span></li>
    <li>
     Обратитесь к <a href="https://github.com/php/php-src/blob/master/ext/session/tests/save_handler.inc" class="link external">&raquo;&nbsp;save_handler.inc</a>
     для полного набора рекомендаций по реализации
    </li>
   </ul>
  </p>
 </div>


</div><?php manual_footer($setup); ?>