mirror of
https://github.com/php/doc-es.git
synced 2026-03-25 07:52:21 +01:00
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@337320 c90b9560-bf6c-de11-be94-00142212c4b1
277 lines
11 KiB
XML
277 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 7279eb69e5c0cc54a327d39897cd38d0adef0b50 Maintainer: seros Status: ready -->
|
|
<!-- Reviewed: no Maintainer: andresdzphp -->
|
|
|
|
<appendix xml:id="session.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
&reftitle.examples;
|
|
<section xml:id="session.examples.basic">
|
|
<title>Uso básico</title>
|
|
<para>
|
|
Las sesiones son una forma sencilla de almacenar datos para usuarios de manera individual usando un ID de sesión único.
|
|
Esto se puede usar para hacer persistente la información de estado entre peticiones de páginas. Los ID de sesiones normalmente son
|
|
enviados al navegador mediante cookies de sesión, y el ID se usa para recuperar los datos de sesión existente.
|
|
La ausencia de un ID o una cookie de sesión permite saber a PHP para crear una nueva sesión y generar un nuevo
|
|
ID de sesión.
|
|
</para>
|
|
<para>
|
|
Las sesiones siguen un flujo de trabajo sencillo. Cuando una sesión se inicia, PHP recuperará una
|
|
sesión existente usando el ID pasado (normalmente desde una cookie de sesión) o, si no se pasa una sesión,
|
|
se creará una sesión nueva. PHP rellenará la variable superglobal <varname>$_SESSION</varname>
|
|
con cualesquiera datos de la sesión iniciada. Cuando PHP se cierra, automáticamente
|
|
toma el contenido de la variable superglobal <varname>$_SESSION</varname>, la serializa, y la envía
|
|
para almacenarla usando el gestor de almacenamiento de sesiones.
|
|
</para>
|
|
<para>
|
|
Por omisión, PHP usa el gestor interno de almacenamiento <parameter>files</parameter>, el cual
|
|
se establece mediante <link linkend="ini.session.save-handler">session.save_handler</link>.
|
|
Éste guarda los datos de sesión en el servidor en la ubicación especificada por la
|
|
directiva de configuración <link linkend="ini.session.save-path">session.save_path</link>.
|
|
</para>
|
|
<para>
|
|
Las sesiones se puede iniciar manualmente usando la función <function>session_start</function>,
|
|
si la directiva <link linkend="ini.session.auto-start">session.auto_start</link> se establece
|
|
a <parameter>1</parameter>, una sesión se iniciará automáticamente ante cualquier petición de arranque.
|
|
</para>
|
|
<para>
|
|
Las sesiones normalmente se cierran automáticamente cuando PHP termina de ejecutar un script, pero se pueden
|
|
cerrar manualmente usando la función <function>session_write_close</function>.
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>
|
|
Registrar una variable con <varname>$_SESSION</varname>.
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
session_start();
|
|
if (!isset($_SESSION['count'])) {
|
|
$_SESSION['count'] = 0;
|
|
} else {
|
|
$_SESSION['count']++;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<example>
|
|
<title>
|
|
Desregistrar una variable con <varname>$_SESSION</varname>
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
session_start();
|
|
unset($_SESSION['count']);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<caution>
|
|
<para>
|
|
NO destruya completamente <varname>$_SESSION</varname> con
|
|
<literal>unset($_SESSION)</literal> ya que esto deshabilitará el
|
|
registro de las variables a través del array superglobal
|
|
<varname>$_SESSION</varname>.
|
|
</para>
|
|
</caution>
|
|
</para>
|
|
<warning>
|
|
<para>
|
|
No se pueden usar referencias en variables de sesión ya que no hay una manera viable
|
|
de restarurar una referencia a otra variable.
|
|
</para>
|
|
</warning>
|
|
<warning>
|
|
<para>
|
|
register_globals sobreescribirá las variables en el ámbito global, cuyos nombres son compartidos con las variables de sesión. Por favor véase <link linkend="security.globals">Uso de Register Globals</link> para más detalles.
|
|
</para>
|
|
</warning>
|
|
<note>
|
|
<para>
|
|
Las sesiones basadas en ficheros (lo predeterminado en PHP) bloquean el fichero de sesión una vez
|
|
que una sesión se abre vía <function>session_start</function> o implícitamente vía
|
|
<link linkend="ini.session.auto-start">session.auto_start</link>. Mientras esté bloqueado,
|
|
ningún otro script puede acceder al mismo fichero de sesión hasta que haya sido
|
|
cerrado al terminar de ejecutarse el primer script, o llamando a
|
|
<function>session_write_close</function>.
|
|
</para>
|
|
<para>
|
|
Esto suele provocar problemas en aquellos sitios Web que realizan muchas peticiones AJAX y
|
|
tienen solicitudes mútliples ejécutandose a la vez. La manera más fácil de lidiar con esto es
|
|
llamando a <function>session_write_close</function> tan pronto como se haya realizado un cambio
|
|
requeirdo a la sesión, preferiblemente antes de finalizar el script.
|
|
Alternativamente, se podría utilizar una sesión diferente en segundo plano que
|
|
admita concurrencia.
|
|
</para>
|
|
</note>
|
|
</section>
|
|
|
|
<section xml:id="session.idpassing">
|
|
<title>Pasar el ID de Sesión</title>
|
|
<para>
|
|
Hay dos métodos para propagar un id de sesión:
|
|
<itemizedlist>
|
|
<listitem>
|
|
<simpara>
|
|
Cookies
|
|
</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>
|
|
Parámetro de URL
|
|
</simpara>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
<para>
|
|
El módulo de sesiones soporta ambos métodos. Las cookies son óptimas, pero
|
|
ya que no están siempre disponibles, también se proporciona una manera
|
|
alternativa. El segundo método embebe el id de sesión directamente en las URL.
|
|
</para>
|
|
<para>
|
|
PHP es capaz de transformar enlaces transparentemente. A menos que se use
|
|
PHP 4.2.0 o posterior, se necesita habilitarlo manualmente cuando se construye PHP.
|
|
Bajo Unix, pase <link linkend="ini.session.use-trans-sid">
|
|
--enable-trans-sid</link> para la configuración. Si esta opción de
|
|
construcción y la opción en tiempo de ejecución
|
|
<literal>session.use_trans_sid</literal> están habilitadas, las URI relativas
|
|
se modificarán para contener el id de sesión automáticamente.
|
|
<note>
|
|
<para>
|
|
La directiva de &php.ini; <link linkend="ini.arg-separator.output">arg_separator.output</link>
|
|
permite personalizar el separador de argumentos. Para una conformidad completa con
|
|
XHTML, especifique &amp; allí.
|
|
</para>
|
|
</note>
|
|
</para>
|
|
<para>
|
|
Alternativamente, se puede usar la constante <constant>SID</constant>, que está
|
|
definida si la sesión se inició. Si el cliente no envía una cookie de sesión
|
|
apropiada, tiene la forma <literal>session_name=session_id</literal>.
|
|
De otro modo se desarrolla en una cadena vacía. Así, se puede embeberla
|
|
incondicionalmente dentro de las URL.
|
|
</para>
|
|
<para>
|
|
El siguiente ejemplo muestra cómo registrar una variable, y
|
|
cómo enlazar correctamente a otra página usando <constant>SID</constant>.
|
|
<example>
|
|
<title>Contar el número de peticiones de un sólo usuario</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
session_start();
|
|
|
|
if (empty($_SESSION['count'])) {
|
|
$_SESSION['count'] = 1;
|
|
} else {
|
|
$_SESSION['count']++;
|
|
}
|
|
?>
|
|
|
|
<p>
|
|
Hola visitante, ha visto esta página <?php echo $_SESSION['count']; ?> veces.
|
|
</p>
|
|
|
|
<p>
|
|
Para continuar, <a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">haga clic
|
|
aquí</a>.
|
|
</p>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
La función <function>htmlspecialchars</function> se puede usar cuando se imprime
|
|
<constant>SID</constant> para prevenir ataques relacionados con XSS.
|
|
</para>
|
|
<para>
|
|
Imprimir <constant>SID</constant>, como se mostró arriba, no es necesario si
|
|
<link linkend="ini.session.use-trans-sid">
|
|
--enable-trans-sid</link> se usó para compilar PHP.
|
|
</para>
|
|
<note>
|
|
<para>
|
|
Se asume que las URL no relativas apuntan a sitios externos y
|
|
por lo tanto no añaden <constant>SID</constant>, ya que sería un riesgo para la seguridad
|
|
filtrar <constant>SID</constant> a un servidor diferente.
|
|
</para>
|
|
</note>
|
|
</section>
|
|
|
|
<section xml:id="session.customhandler">
|
|
<title>Gestores de Sesión Personalizados</title>
|
|
<para>
|
|
Para implementar el almacenamiento en bases de datos, o cualquier otro método de almacenamiento,
|
|
se necesita usar <function>session_set_save_handler</function> para
|
|
crear un conjunto de funciones de almacenamiento a nivel de ususario. A partir de PHP 5.4.0 se pueden crear gestores de sesiones
|
|
usando la clase <classname>SessionHandlerInterface</classname> o extendiendo los gestores internos de PHP heredando
|
|
de la clase <classname>SessionHandler</classname>.
|
|
</para>
|
|
<para>
|
|
Las llamadas de retorno especificadas en <function>session_set_save_handler</function> son métodos
|
|
llamados por PHP durante el ciclo de vida de una sesión: <parameter>open</parameter>, <parameter>read</parameter>,
|
|
<parameter>write</parameter> y <parameter>close</parameter>, y para las tareas domésticas:
|
|
<parameter>destroy</parameter> para borrar una sesión y <parameter>gc</parameter> para la recoleción periódica
|
|
de basura.
|
|
</para>
|
|
<para>
|
|
Por lo tanto, PHP siempre necesita gestores de almacenamiento de sesiones. El predeterminado normalmente es el
|
|
gestor de almacenamiento interno 'files'. Se puede establecer un gestor de almacenamiento personalizado usando
|
|
<function>session_set_save_handler</function>. Se pueden porporcionar de forma alternativa gestores de almacenamiento
|
|
interno mediante extensiones de PHP, tales como <parameter>sqlite</parameter>,
|
|
<parameter>memcache</parameter> y <parameter>memcached</parameter> y pueden establecerse con
|
|
<link linkend="ini.session.save-handler">session.save_handler</link>.
|
|
</para>
|
|
<para>
|
|
Cuando se inicia la sesión, PHP llamará internamente al gestor <parameter>open</parameter> seguido de
|
|
la llamada de retorno <parameter>read</parameter> la cual debería devolver una cadena codificada exactamente como si fuera
|
|
pasada originalmente para almacenamiento. Una vez que la llamada de retorno <parameter>read</parameter> devuelve la cadena codificada, PHP
|
|
la decodificará y rellenará el array resultante en la variable superglobal <varname>$_SESSION</varname>.
|
|
</para>
|
|
<para>
|
|
Cuando PHP se cierra (o se llama a <function>session_write_close</function>),
|
|
PHP codificará internamente la variable superglobal <varname>$_SESSION</varname> y la pasará
|
|
conjuntamente con el ID de sesión a la llamada de retorno <parameter>write</parameter>.
|
|
Después de finalizada la llamada de retorno <parameter>write</parameter>, PHP invocará internamente al
|
|
gestor de llamada de retorno <parameter>close</parameter>.
|
|
</para>
|
|
<para>
|
|
Cuando una sesión se destruye de forma específica, PHP llamará al gestor <parameter>destroy</parameter> con
|
|
el ID de sesión.
|
|
</para>
|
|
<para>
|
|
PHP llamará a la llamada de retorno <parameter>gc</parameter> de vez en cuando para
|
|
terminar cualquier registro de sesión según lo establecido en el tiempo de vida máximo de una sesión.
|
|
Esta rutina debería borrar todos los registros del almacenamiento persistente a los que se
|
|
accedió por última vez más allá del parámetro <parameter>$lifetime</parameter>.
|
|
</para>
|
|
</section>
|
|
</appendix>
|
|
|
|
<!-- 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
|
|
-->
|
|
|