-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathsession-set-save-handler.xml
419 lines (394 loc) · 15.9 KB
/
session-set-save-handler.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: c38e57680de5e8149954272763f789add08db15a Maintainer: seros Status: ready -->
<!-- Reviewed: no Maintainer: andresdzphp -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.session-set-save-handler">
<refnamediv>
<refname>session_set_save_handler</refname>
<refpurpose>Establece funciones de almacenamiento de sesiones a nivel de usuario</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>bool</type><methodname>session_set_save_handler</methodname>
<methodparam><type>callable</type><parameter>open</parameter></methodparam>
<methodparam><type>callable</type><parameter>close</parameter></methodparam>
<methodparam><type>callable</type><parameter>read</parameter></methodparam>
<methodparam><type>callable</type><parameter>write</parameter></methodparam>
<methodparam><type>callable</type><parameter>destroy</parameter></methodparam>
<methodparam><type>callable</type><parameter>gc</parameter></methodparam>
<methodparam choice="opt"><type>callable</type><parameter>create_sid</parameter></methodparam>
</methodsynopsis>
<para>
Desde PHP 5.4 es posible registrar el siguiente prototipo:
</para>
<methodsynopsis>
<type>bool</type><methodname>session_set_save_handler</methodname>
<methodparam><type>SessionHandlerInterface</type><parameter>sessionhandler</parameter></methodparam>
<methodparam choice="opt"><type>bool</type><parameter>register_shutdown</parameter><initializer>true</initializer></methodparam>
</methodsynopsis>
<para>
<function>session_set_save_handler</function> establece las funciones
de almacenamiento de sesiones a nivel de usuario que se usan para almacenar y
recuperar información asociada con una sesión. Es más útil
cuando se prefiere un método de almacenamiento distinto de aquellos proporcionados
por las sesiones de PHP. Esto es, almacenar la información de sesión en una base de datos local.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
Esta función tiene dos prototipos.
<variablelist>
<varlistentry>
<term><parameter>sessionhandler</parameter></term>
<listitem>
<para>
Una instancia de una clase que implemente
<interfacename>SessionHandlerInterface</interfacename>, tal como
<classname>SessionHandler</classname>, para registrarla como el gestor de
sesión. Sólo desde PHP 5.4.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>register_shutdown</parameter></term>
<listitem>
<para>
Registrar la función <function>session_write_close</function> como una
función <function>register_shutdown_function</function>.
</para>
</listitem>
</varlistentry>
</variablelist>
o
<variablelist>
<varlistentry>
<term><parameter>open(string $savePath, string $sessionName)</parameter></term>
<listitem>
<para>
La llamada de retorno open funciona como un constructor en las clases y es
ejecutada cuando la sesión está siendo abierta. Es la primera función de llamada
de retorno ejecutada cuando la sesión se inicia automáticamente o
manualmente con <function>session_start</function>.
El valor devuelto es &true; en caso de éxito, &false; en caso de error.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>close()</parameter></term>
<listitem>
<para>
La llamada de retorno close funciona como un destructor en las clases y es
ejecutada después de haber llamado a la llamada de retorno write de la sesión. También se invoca cuando
se llama a <function>session_write_close</function>.
El valor devuelto debería ser &true; en caso de éxito, &false; en caso de error.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>read(string $sessionId)</parameter></term>
<listitem>
<para>
La llamada de retorno <parameter>read</parameter> debe devolver siempre una cadena de sesión
(serializada), o una cadena vacía si no existe información que leer.
</para>
<para>
Esta llamada de retorno es llamda internamente por PHP cuando se inicia la sesión o
cuando se llama a <function>session_start</function>. Antes de invocar a esta llamada de sesión
PHP invocará a la llamda de retorno <parameter>open</parameter>.
</para>
<para>
El valor que devuelve esta llamada de retorno debe estar exactamente en el mismo formato de serialización que fue originalmente
pasado para el almacenamiento de la llamada de retorno <parameter>write</parameter>. El valor devuelto será deserializado
automáticamente por PHP y srá usado para rellenar la variable superglobal <varname>$_SESSION</varname>.
Aunque la información parezca similar a <function>serialize</function>, observe que está en un formato diferente,
el cual está especificado en la configuración ini <link linkend="ini.session.serialize-handler">session.serialize_handler</link>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>write(string $sessionId, string $data)</parameter></term>
<listitem>
<para>
La llamada de retorno <parameter>write</parameter> es llamada cuando la sesión necesita ser almacenada y cerrada. Esta
llamada de retorno recibe el ID de sesión actual, una versión serializada de la variable superglobal <varname>$_SESSION</varname>. El método de
serialización usado internamente por PHP está especificado en la configuración ini <link linkend="ini.session.serialize-handler">session.serialize_handler</link>.
</para>
<para>
La información serializada de sesión pasada a esta llamada de retorno debería ser almacenada junto con el ID de sesión pasado. Al recuperar
esta información, la llamada de retorno <parameter>read</parameter> debe devolver el valor exacto que fue pasado originalmente a
la llamda de retorno <parameter>write</parameter>.
</para>
<para>
Esta llamada de retorno es invocada cuando PHP se cierra o cuando se llamda explícitamente a
<function>session_write_close</function>. Observe que después de ejecutar esta función PHP ejecutará internamente la llamada de retorno <parameter>close</parameter>.
<note>
<para>
El gestor "write" no se ejecuta hasta después de que se cierre el flujo
de salida. Así, la salida desde declaraciones de depuración en el gestor "write"
nunca serán vistas en el navegador. Si es necesaria la salida de depuración,
se sugiere que la salida de depuración sea escrita en un archivo
en su lugar.
</para>
</note>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>destroy($sessionId)</parameter></term>
<listitem>
<para>
Esta llamada de retorno es ejecutada cuando una sesión es destruida con <function>session_destroy</function> o con
<function>session_regenerate_id</function> con el parámetro destroy establecido en &true;.
El valor devuelto debería ser &true; en caso de éxito, &false; en caso de error.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>gc($lifetime)</parameter></term>
<listitem>
<para>
La llamada de retorno del recolector de basura (Garbage Collector) es invocada internamente por PHP de manera periódica para
destruir información antigua de sesiones. La frecuencia es controlada por
<link linkend="ini.session.gc-probability">session.gc_probability</link> y <link linkend="ini.session.gc-divisor">session.gc_divisor</link>.
El valor del tiempo de vida (lifetime) que es pasado a esta llamada de retorno puede establecerse en <link linkend="ini.session.gc-maxlifetime">session.gc_maxlifetime</link>.
El valor devuelto debería ser &true; en caso de éxito, &false; en caso de error.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>create_sid()</parameter></term>
<listitem>
<para>
Esta retrollamada se ejecuta cuando se requiere un nuevo ID de sesión. No
se proporcionan parámetros, y el valor devuelto debería ser un string que
sea un ID de sesión válido para el gestor utilizado.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.success;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>
Gestor de seseiones personalizado: véase el código completo en la sinopsis de <classname>SessionHandlerInterface</classname>.
</title>
<para>
El siguiente código es para la versión 5.4.0 y superiror de PHP. Aquí se muestra la invocación, el código completo puede
verse en la sinopsis de <classname>SessionHandlerInterface</classname> vinculada más arriba.
</para>
<para>
Observe que usamos el prototipo de POO con <function>session_set_save_handler</function> y
registramos la función de cierre usando la bandera de parámetro de la función. Esto se recomienda
generalmente al registrar objetos como gestores de almacenamiento de sesiones.
</para>
<programlisting role="php">
<![CDATA[
<?php
class MySessionHandler implements SessionHandlerInterface
{
// implementar las interfaces aquí
}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
// proceder a estblecer y recuperar valores mediante clave desde $_SESSION
]]>
</programlisting>
</example>
<example>
<title>Gestor de almacenamiento de sesiones personalizado usando objetos</title>
<para>
El siguiente código es para versiones de PHP inferiores a 5.4.0.
</para>
<para>
El siguiente ejemplo proporciona un almacenamiento de sesiones basado en fichero similar al
gestor de almacenamiento de sesiones de PHP predeterminado <parameter>files</parameter>. Este
ejemplo podría extenderse fácilmente para cubrir el almacenamiento de bases de datos usando su
motor de bases de datos favorito soportado por PHP.
</para>
<para>
Observe que registramos de forma adicional la función de cierre <function>session_write_close</function>
usando <function>register_shutdown_function</function> bajo PHP inferior a 5.4.0.
Esto se recomienda generalmente al registrar objetos como gestores de almacenamiento de sesiones bajo PHP inferior
a 5.4.0.
</para>
<programlisting role="php">
<![CDATA[
<?php
class FileSessionHandler
{
private $savePath;
function open($savePath, $sessionName)
{
$this->savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
function close()
{
return true;
}
function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}
function write($id, $data)
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
function destroy($id)
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}
return true;
}
}
$handler = new FileSessionHandler();
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
// lo siguiente previene de efectos inesperados al usar objetos como gestores de almacenamiento
register_shutdown_function('session_write_close');
session_start();
// proceder para establecer y recuperar valores por clave desde $_SESSION
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<warning>
<para>
Cuando se usan objetos como gestores de almacenamiento de sesionea es importante registrar la
función de cierre con PHP para evitar efectos secundarios inesperados ya que
PHP internamente destruye objetos en el cierre y puede prevenir que
<parameter>write</parameter> y <parameter>close</parameter> sean llamados.
Normalmente se debería registrar <parameter>'session_write_close'</parameter> usando la
función <function>register_shutdown_function</function>.
</para>
<para>
A partir de PHP 5.4.0 se puede usar <function>session_register_shutdown</function> o
simplemente la bandera 'register shutdown' al invocar
<function>session_set_save_handler</function> usando el método de POO the OOP y pasando una
instancia que implemente <classname>SessionHandlerInterface</classname>.
</para>
</warning>
<warning>
<para>
A partir de PHP 5.0.5 los gestores <parameter>write</parameter> y
<parameter>close</parameter> son llamados después de la destrucción
del objeto y por lo tanto no pueden usar objetos o lanzar excepciones.
Las excepciones no pueden ser capturadas ya que no serán capturadas ni
cualquier rastro de excepción será mostrado y la ejecución se interrumpirá de improviso.
Sin embargo, los destructores de objetos pueden usar sesiones.
</para>
<para>
Es posible llamar a <function>session_write_close</function> desde el
destructor para solucionar este problema de "quién fue antes, si el huevo o la gallina" pero la forma más fiable es
registrar la función de ceirre como está descrito más arraba.
</para>
</warning>
<warning>
<para>
El directorio de trabajo actual es cambiado en algunas SAPI si la sesión
se cierra al finalizar el script. Es posible cerrar la sesión antes
con <function>session_write_close</function>.
</para>
</warning>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>5.5.1</entry>
<entry>
Se añadió el parámetro opcional <parameter>create_sid</parameter>.
</entry>
</row>
<row>
<entry>5.4.0</entry>
<entry>
Se añadió <interfacename>SessionHandlerInterface</interfacename> para la implementación de gestores de sesión y
<classname>SessionHandler</classname> para exponer gestores de sesión internos de PHP.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member>
La directiva de configuración
<link linkend="ini.session.save-handler">session.save_handler</link>.
</member>
<member>
La directiva de configuración
<link linkend="ini.session.serialize-handler">session.serialize_handler</link>.
</member>
<member>La función <function>register_shutdown_function</function></member>
<member>La función <function>session_register_shutdown</function> para PHP 5.4.0+</member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->