<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'function.session-set-save-handler.php',
    1 => 'session_set_save_handler',
    2 => 'Configura las funciones de almacenamiento de sesiones',
  ),
  'up' => 
  array (
    0 => 'ref.session.php',
    1 => 'Funciones de sesi&oacute;n',
  ),
  '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' => 'es',
    '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">Configura las funciones de almacenamiento de sesiones</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.session-set-save-handler-description">
  <h3 class="title">Descripción</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">
   Es posible registrar el siguiente prototipo:
  </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> configura las funciones
   de almacenamiento de sesiones, y permite elegir funciones de usuario
   para guardar y leer todas las sesiones. Esta función es
   muy práctica cuando se necesita guardar los datos de sesión
   utilizando una técnica diferente al sistema de archivos proporcionado
   por defecto, por ejemplo, el almacenamiento en base de datos.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.session-set-save-handler-parameters">
  <h3 class="title">Parámetros</h3>
  <p class="para">
   Esta función tiene dos prototipos.
   <dl>
    
     <dt><code class="parameter">sessionhandler</code></dt>
     <dd>
      <p class="para">
       Una instancia de una clase que implementa una o más de las siguientes interfaces:
       <span class="interfacename"><a href="class.sessionhandlerinterface.php" class="interfacename">SessionHandlerInterface</a></span>, y opcionalmente
       <span class="interfacename"><a href="class.sessionidinterface.php" class="interfacename">SessionIdInterface</a></span>, y/o
       <span class="interfacename"><a href="class.sessionupdatetimestamphandlerinterface.php" class="interfacename">SessionUpdateTimestampHandlerInterface</a></span>,
       como la clase <span class="classname"><a href="class.sessionhandler.php" class="classname">SessionHandler</a></span>,
       para el registro como manejador de sesión.
      </p>
     </dd>
    
    
     <dt><code class="parameter">register_shutdown</code></dt>
     <dd>
      <p class="para">
       Registra la función <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span>
       como función <span class="function"><a href="function.register-shutdown-function.php" class="function">register_shutdown_function()</a></span>.
      </p>
     </dd>
    
   </dl>

   o

   <dl>
    
     <dt><code class="parameter">open</code></dt>
     <dd>
      <p class="para">
       Una función de retorno con la siguiente firma:
       <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">
       La función de retorno <code class="literal">open</code> funciona como un constructor
       en una clase, y se ejecuta cuando la sesión se abre.
       Es la primera función de retorno ejecutada cuando la sesión
       comienza automáticamente o manualmente con la función
       <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span>. El valor devuelto
       es <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito o <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si ocurre un error.
      </p>
     </dd>
    
    
     <dt><code class="parameter">close</code></dt>
     <dd>
      <p class="para">
       Una función de retorno con la siguiente firma:
       <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">
       La función de retorno <code class="literal">close</code> funciona como un
       destructor en una clase, y se ejecuta una vez que la función
       de retorno write de la sesión ha terminado de ejecutarse. También
       es llamada cuando la función <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> es llamada.
       El valor devuelto es <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito, o <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si ocurre un error.
      </p>
     </dd>
    
    
     <dt><code class="parameter">read</code></dt>
     <dd>
      <p class="para">
       Una función de retorno con la siguiente firma:
       <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">
       La función de retorno <code class="parameter">read</code> debe siempre devolver
       un string serializado que contenga los datos de sesión codificados
       o un string vacío si no hay datos que leer.
      </p>
      <p class="para">
       Esta función de retorno es llamada internamente por PHP cuando la sesión
       comienza o cuando la función <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> es llamada.
       Antes de que esta función de retorno sea invocada, PHP invocará
       la función de retorno <code class="parameter">open</code>.
      </p>
      <p class="para">
       El valor devuelto por esta función de retorno debe ser exactamente del mismo
       formato de serialización que el pasado para el almacenamiento a la función
       de retorno <code class="parameter">write</code>. El valor devuelto será deserializado
       automáticamente por PHP y utilizado para poblar la variable superglobal
       <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>. Aunque los datos se asemejen fuertemente
       a los emitidos por la función <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span>, note que es un
       formato diferente, que es especificado mediante la opción de configuración
       <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">
       Una función de retorno con la siguiente firma:
       <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">
       La función de retorno <code class="parameter">write</code> es llamada cuando la sesión
       debe ser guardada y cerrada. Esta función de retorno recibe el identificador de
       la sesión actual así como una versión serializada del contenido de la variable
       superglobal <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>. El método de serialización utilizado internamente
       por PHP es especificado mediante la opción de configuración
       <a href="session.configuration.php#ini.session.serialize-handler" class="link">session.serialize_handler</a>.
      </p>
      <p class="para">
       Los datos de sesión serializados pasados a esta función de retorno deben ser
       almacenados utilizando el identificador de sesión proporcionado. Al recuperar
       estos datos, la función de retorno <code class="parameter">read</code> debe devolver
       el valor exacto, originalmente pasado a la función de retorno <code class="parameter">write</code>.
      </p>
      <p class="para">
       Esta función de retorno es invocada cuando PHP se detiene o explícitamente
       cuando la función <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> es llamada.
       Note que después de la ejecución de esta función, PHP ejecutará internamente
       la función de retorno <code class="parameter">close</code>.
       <blockquote class="note"><p><strong class="note">Nota</strong>: 
        <p class="para">
         El manejador de escritura no se ejecuta hasta que el flujo de salida
         no haya sido cerrado. Por lo tanto, la salida de las peticiones de depuración
         del manejador &quot;write&quot; nunca será mostrada en el navegador.
         Si la salida de depuración es necesaria, se sugiere que sea dirigida a un archivo.
        </p>
       </p></blockquote>
      </p>
     </dd>
    
    
     <dt><code class="parameter">destroy</code></dt>
     <dd>
      <p class="para">
       Una función de retorno con la siguiente firma:
       <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">
       Esta función de retorno es ejecutada cuando una sesión es destruida
       con la función <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span> o con
       <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> con el parámetro de destrucción definido
       a <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>. El valor devuelto debe ser <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito, o <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si ocurre un error.
      </p>
     </dd>
    
    
     <dt><code class="parameter">gc</code></dt>
     <dd>
      <p class="para">
       Una función de retorno con la siguiente firma:
       <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">
       La función de retorno del recolector de basura es invocada internamente por PHP
       periódicamente para purgar los datos de sesión antiguos. La frecuencia
       es controlada por las opciones de configuración
       <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a> y
       <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a>.
       El valor de la duración de vida pasado a esta función de retorno puede ser
       definido mediante la opción de configuración <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>.
       El valor devuelto debe ser <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito, o <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si ocurre un error.
      </p>
     </dd>
    
    
     <dt><code class="parameter">create_sid</code></dt>
     <dd>
      <p class="para">
       Una función de retorno con la siguiente firma:
       <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">
       Esta función de retorno es ejecutada cuando se necesita un nuevo ID de sesión.
       No se proporcionan parámetros, y el valor devuelto debe ser un string que es un ID de sesión válido para su manejador.
      </p>
     </dd>
    
    
     <dt><code class="parameter">validate_sid</code></dt>
     <dd>
      <p class="para">
       Una función de retorno con la siguiente firma:
       <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">
       Esta función de retorno es ejecutada cuando una sesión va a comenzar, un ID
       de sesión es proporcionado y
       <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
       está activado.
       <code class="parameter">key</code> es el ID de sesión a validar.
       Un ID de sesión es válido, si una sesión con este ID ya existe.
       El valor de retorno debe ser <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito, <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en caso de fallo.
      </p>
     </dd>
    
    
     <dt><code class="parameter">update_timestamp</code></dt>
     <dd>
      <p class="para">
       Una función de retorno con la siguiente firma:
       <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">
       Esta función de retorno es ejecutada cuando una sesión es actualizada.
       <code class="parameter">key</code> es el ID de sesión, <code class="parameter">val</code>
       son los datos de sesión.
       El valor de retorno debe ser <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito, <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en caso de fallo.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.session-set-save-handler-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="para">
   Esta función retorna <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en caso de éxito o <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si ocurre un error.
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.session-set-save-handler-examples">
  <h3 class="title">Ejemplos</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 
     Manejador de sesión personalizado: ver el código completo
     en la documentación sobre la interfaz <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span>.
    </strong></p>
    <div class="example-contents"><p>
     Solo mostramos la invocación aquí, el ejemplo completo puede verse en
     la documentación de la interfaz
     <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span>.
    </p></div>
    <div class="example-contents"><p>
     Note que aquí utilizamos el prototipo orientado a objetos con
     <span class="function"><strong>session_set_save_handler()</strong></span> y registramos la función de cierre
     utilizando el flag en el parámetro de la función. Esto es generalmente
     preferible al registrar objetos como manejadores de guardado de sesión.
    </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">// implementación de la interfaz aquí<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">// proceso para definir y recuperar los valores por sus claves desde $_SESSION</span></span></code></div>
    </div>

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


 <div class="refsect1 notes" id="refsect1-function.session-set-save-handler-notes">
  <h3 class="title">Notas</h3>
  <div class="warning"><strong class="warning">Advertencia</strong>
   <p class="para">
    Los manejadores de escritura <code class="parameter">write</code> y cierre
    <code class="parameter">close</code> son llamados después de la destrucción de los objetos,
    y por lo tanto, no pueden utilizar los objetos ni lanzar excepciones.
    Las excepciones no pueden ser atrapadas ni mostradas,
    y la ejecución solo se detendrá de manera inesperada.
   </p>
   <p class="para">
    Es posible llamar a <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> desde
    el destructor para resolver este problema pero la forma más elegante
    es registrar la función de cierre tal como se describe arriba.
   </p>
  </div>
  <div class="warning"><strong class="warning">Advertencia</strong>
   <p class="para">
    El directorio de trabajo actual cambia según las SAPIs si la sesión
    es cerrada al final del script. Es posible cerrar la sesión más tarde,
    gracias a la función <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">Ver también</h3>
  <p class="para">
   <ul class="simplelist">
    <li>
     La directiva de configuración <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>
    </li>
    <li>
     La directiva de configuración
     <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> - Registra una funci&oacute;n de retrollamada para ejecuci&oacute;n al cierre</span></li>
    <li><span class="function"><a href="function.session-register-shutdown.php" class="function" rel="rdfs-seeAlso">session_register_shutdown()</a> - Funci&oacute;n de cierre de sesiones</span></li>
    <li>
     Ver <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>
     para una implementación procedimental completa
    </li>
   </ul>
  </p>
 </div>


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