[Ir al menú de PHP]
Sesiones (I)

¿Qué son las sesiones?

¿Has estado alguna vez en uno de esos horribles -para mi gusto, claro está- establecimientos (cafeterías, restaurantes) donde debes recoger a la entrada un papelito> que presentas al camarero al pedir tu café, tu cerveza o tu bocadillo de chorizo?.

¿Recuerdas que en esa circunstancias el papelito debe acompañarte mientras permanezcas dentro del establecimiento?

¿Recuerdas que es obligatorio presentar ese papelito a la salida (y pagar, claro está...)?

Recordarás también que una vez que has salido del establecimiento ya puedes hacer con el papelito lo que te plazca. Guardarlo como recuerdo, archivarlo (por si es gasto deducible a efectos fiscales) o tirarlo a la basura, en una papelera -por supuesto- porque se te ve en los ojos que no eres de la especia homus guarricus ;-)

Bueno... pues después de leer por ahí un montón de especulaciones metafísicas sobre las sesiones, servidor que es de pueblo ha llegado a la conclusión de que son exactamente lo mismo que la horripilante y moderna cafetería... eso sí... con dos diferencias importantes: no hace falta pagar a la salida aunque tampoco te servirán bocatas de chorizo.

Como sabes... PHP solo te alimenta el espíritu...

Funciones de sesiones

La gestión de sesiones en PHP utiliza las siguientes funciones:

session_start()

Crea una sesión -o continua con la actual- en función del identificador de sesión pasada por una variable GET o por una cookie.

Devuelve siempre TRUE

session_name()

Recoge el nombre de la sesión. Si no se asigna uno de forma explícita, utiliza como nombre de sesión el contenido de la directiva session.name del fichero de configuración php.ini.

Por defecto ese nombre suele ser PHPSESSID, pero en cualquier caso si quieres comprobarlo con exactitud abre la famosa página info.php y comprueba en ella el valor de la directiva session.name.

session_name('nombre')

Esta función te permite asignar un nuevo nombre a la sesión actual.

Debes tener en cuenta que si cambias de página manteniendo el mismo identificador de sesión (sin cambiar de sesión) esta función (con el nombre correspondiente) debe ser escrita en cada página, debe estar siempre antes que la llamada a la función session_start().

session_cache_limiter()

El limitador de caché controla las cabeceras HTTP de control del caché enviadas al cliente. Estas cabeceras determinan las reglas por las que el contenido de la página puede ser guardado en el caché local del cliente.

Esta opción viene configurada por defecto en las directivas de configuración del fichero php.ini y por defecto suele aparecer activada la opción nocache.

Aunque no he conseguido encontrar una descripción concreta de los valores posibles, parece ser que la opción más segura -para evitar que el almacenamiento en la caché del cliente- sería esta:
session_cache_limiter
('nocache,private')
.

En cualquier caso, en el manual oficial se recomienda utilizar private_no_expire, eso sí, en versiones de PHP a partir de la 4.2.0.

Igual que te comenté al hablar de session_name, si utilizas está función deberás colocarla antes de session_name e igual que en aquel caso deberás repetirla también en cada página.

¡¡Advertencia...!!

Te aconsejo que utilices siempre esta sintaxis cuando se trate de utilizar las funciones anteriores. Sería así:

<?
session_cache_limiter();
session_name('nombre');
session_start();
.....
?>


Es muy importante mantener ese orden y es también IMPORTANTISIMO que este bloque sea el primer elemento de la página -antes de cualquier otra etiqueta- y que no dejes líneas en blanco.

Avisad@ quedas... aunque como siempre eres muy libre de hacer lo que te plazca..

Propagación de las sesiones

La verdadera utilidad de las sesiones es su posibilidad de ser propagadas, es decir que tanto el identificador de sesión como los valores de las variables de sesión -luego te hablaré de estas variables- puedan irse pasando (propagando) de una página a otra sin necesidad de recurrir al uso de formularios.

Para entendernos... se trata de dar validez y utilizar el mismo papelito para movernos en las diferentes secciones de la cafetería de la que hablábamos al principio.

Si entras a la cafetería, te dan el papelito con su número impreso (el identificador de sesión) y con él en la mano ya puedes tomarte una cerveza (te la anotarán en el papelito) y luego irte a hacer pipí -esas cosas suelen ocurrir, no te rías- al w.c. de la cafetería (sin salir de ella, claro está), volver a la barra y pedir el bocata de chorizo, ir al mini-market y comprar chocolatinas, etc. etc.

En cada sección -equivalente a distintas páginas web del mismo sitio- te harán las anotaciones correspondientes siempre en el mismo papelito, o dicho de forma mucho más fina en cada uno de esos movimientos irás propagando la sesión por las diferentes secciones.

En PHP ocurre lo mismo que en esas famosas cafeterías... se te permite propagar las sesiones pero tratando de controlar tus movimientos y tratando de evitar que algún desaprensivo entre sin papelito o se vaya sin pagar.

La vida es así de dura... ;-)

Lo normal y lo fácil es que esa propagación se haga mediante cookies pero como quiera que el usuario tiene la posibilidad de activar la opción no aceptar cookies y eso no vas a poder preveerlo tú (...ya sabes que hay gente muy rara por internet...) los desarrolladores de PHP (que están en todo) han previsto una opción alternativa para esa situación que es la propagación a través de la URL.

Así que... paciencia amig@... vamos por partes.

Propagación con cookies activados

Si quieres que las sesiones se propaguen unicamente cuando está activada la opción aceptar cookies en el navegador del cliente lo primero que tienes que comprobar es un pequeño detalle de la configuración de tu PHP. Vas a la famosa página info.php y miras si session.use_trans_sid tiene valor 1 ó 0.

Si ese valor es 1 indicaría que PHP ha sido compilado con la opción --enable-trans-sid, o lo que es lo mismo que está activada la propagación en modo transparente. Si eso es así para que la sesión se propague bastará con que hagas la llamada a la nueva página siguiendo el método de toda la vida, es decir:
<A href="pagxx.php"> y que esa nueva página tenga al principio del todo el famoso script

<?
session_cache_limiter();
session_name('nombre');
session_start();
.....
?>


aunque te aviso que session_cache_limiter no es imprescindible (solo debes ponerlo si quieres establecer un comportamiento de la caché distinto al configurado en php.ini) pero me siento en la obligación de comunicarte que ese parámetro no se propaga y que si no lo especificas al comienzo de cada página no te mantendrá el de la página anterior y utilizará valor que tenga configurado en el fichero php.ini.

Algo parecido ocurre con session_name. Si al iniciar la sesión le pones un nombre a la sesión para que la sesión se propague debes poner en el famoso script anterior la función session_name y además debe contener el mismo nombre que le le habías adjudicado a la sesión en la página de procedencia.

Si no le pones nombre a la sesión, es decir dejas que lleve el nombre por defecto (normalmente PHPSESSID) no hará falta que utilices en ningún sitio session_name.

¿Y si no está activado el modo transparente?

Si session.use_trans_sid tiene valor 0 tendrás que trabajar un poquito más. Pero tranqui... que es poquito...

En ese caso, cuando hagas la llamada a la nueva página tendrás que pasarle el identificador de sesión y tendrás que hacerlo con esta sintaxis (te marco en rojo lo que tienes que añadir:
<A href="pagxx.php?<?=$SID ?>">

Ese añadido no es otra cosa que pasar a la nueva página (?) el valor contenido en la variable PHP llamada $SID que es una variable que contiene el identificador de sesión y que PHP genera de forma automática.

En todo lo demás, funciona exactamente igual que cuando es transparente.

Propagación con cookies desactivados

Si quieres propagar una sesión, incluso cuando el cliente tenga bloqueada la opción de aceptar cookies parece que el truco está en modificar otro poquito la sintaxis de la llamada a la nueva página.

En ese supuesto creo que deberías escribir (sigo marcando en rojo el añadido):

<A href="pagxx.php?<echo session_name(). "=" .session_id()?>">

Si todo funciona tal como he podido comprobar en mis experimentos la sesión se propagará tanto si el navegador acepta cookies como si tiene bloqueada esa aceptación.


 
 


Iniciando y propagando sesiones

Aquí tienes un ejemplo de como iniciar una sesión y también podrás comprobar como se propaga la sesión al llamar a la misma página.

Esta opción funcionará con la opción aceptar cookies.

Si la ejecutas podrás observar como al llamar reiteradamente a la misma página -pulsar en el enlace- se mantiene el valor de identificador de sesión (una cadena kilométrica, verdad).

Si bloqueas la aceptación de cookies (recuerda que para ese cambio de configuración se active deberás cerrar el navegador después de hacer la modificación de esa condición de privacidad) podrás comprobar que la sesión no se propaga y que cada vez que pulsas el enlace te aparece un nuevo valor en el identificador de sesión, es decir, se crea una nueva sesión.


<?
session_start();
#pedimos que escriba el identificador único y el nombre de la sesión
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo153.php">Volver a llamar está página</A>


Ejemplo 153.php

En este otro ejemplo solo hemos hecho el añadido en rojo para el caso de que PHP no esté compilado para --enable-trans-sid.

Si lo ejecutas podrás comprobar exactamente lo mismo que en el ejemplo anterior. Y si desactivas las cookies te pasará lo mismo que allí.


<?
 session_start();
#pedimos que escriba el identificador único y el nombre de la sesión
 echo session_id(),"<br>";
 echo session_name(),"<br>";
?>
<A Href="ejemplo153.php?<?=$SID ?>">Volver a llamar está página</A>


Ejemplo 153a.php

Este tercer ejemplo -no te quejarás de los ejemplos- parece funcionar con carga y con pasajeros, es decir, que tanto aceptando cookies como con esa opción desactivada se consigue propagar la sesión.

Y como me temo que... tú como Santo Tomás... pues hala... a meter el dedo... y a comprobar que no te engaño... y además harás muy bien en no fiarte... ya se sabe que las escopetas las carga el diablo...;-)


<?
session_start();
#pedimos que escriba el identificador único y el nombre de la sesión
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo153.php?<?echo session_name()."=".session_id()?>">
       Volver a llamar está página</A>


Ejemplo 153b.php


Sesiones con nombre propio

En estos ejemplos he tratado de crear y propagar sesiones con nombre y a la vez comprobar y darte la opción de comprobar que la funcionalidad es idéntica a los ejemplos anteriores. Las limitaciones en cuanto a la opción de aceptar cookies o no aceptarlos son exactamente las mismas de los ejemplos anteriores.

También he incluido session_cache_limiter con las restricciones de nocache con lo cual el navegador no guardará las páginas de ejemplo en la caché.

Si cambias los parámetros (nocache,private por public) podrás comprobar que la página web devuelta por el servidor si se almacena en la caché.


<?
session_cache_limiter('nocache,private');
session_name('leocadia');
session_start();
#pedimos que escriba el identificador único
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo154.php">Volver a llamar está página</A>


Ejemplo 154.php
  


<?
session_cache_limiter('nocache,private');
session_name('leocadia');
session_start();
#pedimos que escriba el identificador único
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo154a.php?<?=$SID ?>">Volver a llamar está página</A>


Ejemplo 154a.php



<?
session_cache_limiter('nocache,private');
session_name('leocadia');
session_start();
#pedimos que escriba el identificador único
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo154b.php?<?echo session_name()."=".session_id()?>">
                  Volver a llamar está página</A>


Ejemplo 154b.php


Las cookies de sesión y sus parámetros

Para el caso de que el navegador del cliente tenga activada la opción de aceptar cookies PHP dispone de una función que permite leer los parámetros de esa cookie Para ello dispone de la función:

       session_get_cookie_params()

Esta función devuelve un array asociativo con los siguientes índices:

lifetime
Indica el tiempo de duración de la duración de la cookie

path
Indica la ruta -en el ordenador del cliente- en la que se almacenan los datos de la sesión

domain
Indica el dominio de procedencia de la cookie

secure
Indica si la cookie solo puede ser enviada a través de conexiones seguras (1) o si no considera esa posibilidad (0).

Los valores por defecto para estos parámetros se pueden establecer en la configuración del fichero php.ini, pero... si utilizas un servidor remoto en el que no tienes privilegios de acceso a ese fichero php.ini puedes conocer su configuración,(aunque -logicamente- no podrás modificarla) utilizando info.php y comprobando estos valores:

session.cookie_lifetime que suele tener como valor por defecto 0
session.cookie_path cuyo valor por defecto / lo que equivale a que la cookie se almacene en el mismo directorio que las páginas visitadas
session.cookie_domain que habitualmente está configurado como no value
session.cookie_secure que suele estar por defecto con valor off.

Como podrás comprobar si ejecutas los ejemplos, en lo relativo a aceptación de cookies funciona todo exactamente igual que en los ejemplos anteriores.


<?
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
# recogemos en la variable $a el array con los datos de la sesión
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo155.php">Volver a llamar está página</A>


Ejemplo 155.php

<?
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
# recogemos en la variable $a el array con los datos de la sesión
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo155a.php?<?=$SID ?>">Volver a llamar está página</A>


Ejemplo 155a.php

<?
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
# recogemos en la variable $a el array con los datos de la sesión
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo155b.php?<?echo session_name()."=".session_id()?>">
                  Volver a llamar está página</A>


Ejemplo 155b.php

Como habrás podido observar, con las configuraciones habituales por defecto las cookies no dejan de ser una mera anécdota (los valores suelen ser nulos) pero... como en esta vida todo tiene arreglo... menos lo feo ;-) PHP tiene prevista esta eventualidad y dispone de una función

       session_set_cookie_params(duración ,'path','dominio',segura)

que permite establecer esos parámetros unicamente para la página en la que está insertado y que como en los casos anteriores tiene tres posibilidades de script.

Estos son los scripts que he utilizado para mis experimentos...

Tanto en el ejemplo156.php como en ejemplo156a.php se guardará -siempre que esté configurada la opción aceptar cookies en el navegador del cliente- una cookie que tendrá una caducidad de 10 minutos (el valor 10 de session_set_cookie_params).

Esa cookie se guardará en el mismo directorio (/) donde se guardan las páginas web visitadas (el famoso C:\WINDOWS\Temporary Internet Files, en la configuración por defecto de IE), pero... ¡¡ojo al Cristo que es de plata...!!, eso solo ocurrirá si -tal como ves en el ejemplo- pones en el parámetro dominio el nombre real del dominio donde está alojada la web.

Así que si se te ha ocurrido la posibilidad de gastar una broma a los visitantes de tu site poniendo en la cookie aquello de -como dice mi amigo Angel- guarras.com me temo que no se te logrará y sencillamente... no se guardará la cookie.

Supongo yo que l@s desarrolladores de PHP han filtrado esa posibilidad por razones de seguridad. Pero... ya sabes, el hecho de que haya puesto en mis ejemplos rinconastur.com no forma parte del autobombo -ganas no me habrían faltado... ya sabes eso de vanitas-vanitatis- sino de la necesidad de hacerlo para que los ejemplos funcionen. Las cosas como son....

Si tu visitante tiene desactivada la opción aceptar cookies, no le aparecerá ningún mensaje de error pero -como parece obvio- la cookie no se guardará.


<?
session_set_cookie_params (10,"/","rinconastur.com", 0);
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo156.php">Volver a llamar está página</A>


Ejemplo 156.php

<?
session_set_cookie_params (10,"/","rinconastur.com", 0);
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo156a.php?<?=$SID ?>">Volver a llamar está página</A>


Ejemplo 156a.php

En el ejemplo siguiente hay algunas novedades importantes. Aparte de preveer la posibilidad de que el cliente tenga desactivada la opción aceptar cookies. En casos -tanto aceptando cookies como sin aceptarlas- lo que guardará en la caché del cliente será la página web resultante de la ejecución del script cosa que no ocurría en los supuestos anteriores ya que la opción session_cache_limiter por defecto de mi sitio web es -¿lo recuerdas?- nocache, pero con esta sintaxis, si guarda la página aunque con en un fecha de expiración.


<?
session_set_cookie_params (10,"/","rinconastur.com", 0);
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo156b.php?<?echo session_name()."=".session_id()?>">
                  Volver a llamar está página</A>


Ejemplo 156b.php


Por si acaso....

No me gusta engañar a al personal... y por eso me veo en la obligación de hacerte algunas puntualizaciones en lo relativo a los ejemplos anteriores y a mis comentarios.

Y debes saber -justicia obliga- que tanto lo relativo al nombre de dominio como a la forma de guardar o no guardar cookies y/o página web no tienen ningún soporte documental (simplemente no lo he encontrado) y mis comentarios solo son el resultado de mis experimentos y en consecuencia conclusiones exclusivamente personales. ¡¡Empirismo puro...!!

He tratado de ser riguroso en la experimentación pero... nunca se sabe.

Hasta aquí solo te he comentado mis experiencias con el papelito de apuntar de la cafetería pero aún no te he comentado lo que me ha ocurrido cuando traté de comprar el bocata de chorizo, la cerveza o las chocolatinas...

Pero, paciencia... amig@... en la página siguiente te comentaré mis experiencias con las variables de sesión...


Sugerir a un/a amig@ Envíame tus comentarios
Anterior
Indice
Siguiente