1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-25 07:52:21 +01:00
Files
archived-doc-es/reference/session/examples.xml
Pedro Antonio Gil Rodríguez 23b2de887a Actualización a la última versión
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@337320 c90b9560-bf6c-de11-be94-00142212c4b1
2015-08-07 10:29:03 +00:00

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;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
-->