¿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>
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>
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>
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>
<?
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>
<?
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>
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>
<?
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>
<?
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>
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>
<?
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>
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>
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...