El apoyo que PHP proporciona para las sesiones consiste en una forma de
conservar ciertos datos a lo largo de los subsiguientes accesos, lo cual
le permite construir aplicaciones más personalizadas e incrementar el
atractivo de su sitio web.
Si ya está familiarizado con el tratamiento de sesiones de PHPLIB,
notará que algunos conceptos son similares al soporte de las sesiones
de PHP.
A cada visitante que accede a su web se le asigna un identificador único,
llamado "session id" (identificador de sesión). Éste se almacena
en una cookie por parte del usuario o se propaga en la URL.
El soporte de las sesiones le permite registrar un número arbitrario de
variables que se conservarán en las siguientes peticiones. Cuando un
visitante acceda a su web, PHP comprobará automáticamente (si
session.auto_start está puesto a 1) o cuando usted lo especifique (de forma
explícita mendiante session_start() o implícita a través
de session_register()) si se le ha enviado un "session id"
específico con su petición, en cuyo caso se recrean las variables que se
habían guardado anteriormente.
Todas las variables registradas son almacenadas tras finalizar la petición.
Las variables que están indefinidas se marcan como no definidas. En los
subsiguientes accesos, no estarán definidas por el módulo de sesiones a
menos que el usuario las defina más tarde.
Las opciones de configuración track_vars y register_globals influyen
notablemente en la forma en que las variables de la sesión se almacenan
y restauran.
Nota:
A partir de PHP 4.0.3, track_vars siempre está activado.
Nota:
A partir de PHP 4.1.0, $_SESSION está disponible como
variable global, al igual que $_POST, $_GET,
$_REQUEST y demás. Al contrario que
$HTTP_SESSION_VARS, $_SESSION siempre es
global. Por tanto, no se debe usar global para $_SESSION.
Si track_vars está activado y
register_globals está
desactivado, sólo los miembros del vector asociativo global
$HTTP_SESSION_VARS pueden ser registrados como variables de
la sesión. Las variables restauradas de la sesión sólo estarán disponibles en
el vector $HTTP_SESSION_VARS.
Ejemplo 1.
Registrar una variable con track_vars
activado
<?php session_start(); if (isset($HTTP_SESSION_VARS['count'])) { $HTTP_SESSION_VARS['count']++; } else { $HTTP_SESSION_VARS['count'] = 0; } ?>
|
|
Se recomienda usar $_SESSION (o
$HTTP_SESSION_VARS con PHP 4.0.6 o inferior) por seguridad
y para hacer el código más legible. Con $_SESSION o
$HTTP_SESSION_VARS, no es necesario usar las funciones
session_register() / session_unregister() / session_is_registered(). Los usuarios
pueden acceder a una variable de la sesión como si se tratase de una variable
normal.
Ejemplo 2.
Registrar una variable con $_SESSION.
<?php session_start(); // Use $HTTP_SESSION_VARS con PHP 4.0.6 o inferior if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; } else { $_SESSION['count']++; } ?>
|
|
Ejemplo 3.
Borrar una variable con $_SESSION.
<?php session_start(); // Use $HTTP_SESSION_VARS con PHP 4.0.6 o inferior unset($_SESSION['count']); ?>
|
|
Si register_globals
está activado, todas las variables globales pueden ser registradas como
variables de la sesión, y las variables de la sesión serán restauradas a sus
correspondientes variables globales. Como PHP debe saber qué variables
globles están registradas como variables de la sesión, los usuarios deben
registrar las variables con la función session_register(), mientras que con
$HTTP_SESSION_VARS/$_SESSION no es
necesario usar session_register().
Ejemplo 4.
Registrar una variable con register_globals
activado
<?php if (!session_is_registered('count')) { session_register("count"); $count = 0; } else { $count++; } ?>
|
|
Si track_vars y
register_globals
están activados, las variables globales y las entradas de
$HTTP_SESSION_VARS/$_SESSION harán
referencia al mismo valor para variables ya registradas.
Si el usuario utiliza session_register() para registrar una variable, el
vector $HTTP_SESSION_VARS/$_SESSION
no contendrá esa variable hasta que se cargue de los datos de la sesión.
(p.ej. hasta la próxima petición).
Hay dos formas de propagar un "session id":
Cookies
Parámetro en la URL
El módulo de sesiones admite ambas formas. Las Cookies son la mejor
opción, pero como no son fiables (los clientes no están obligados a aceptarlas),
no podemos confiar en ellas. El segundo método incrusta el "session id"
directamente en las URLs.
PHP es capaz de hacerlo de forma transparente al usuario cuando se compila con
--enable-trans-sid. Si activa esta opción, las URIs relativas
serán modificadas de forma que contengan el session id automáticamente.
Alternativamente, puede usar la constante SID que está
definida, si el cliente no envía la cookie adecuada. El SID
puede tener la forma de nombre_de_sesion=session_id o ser
una cadena vacía.
El ejemplo siguiente demuestra cómo registrar una variable, y cómo colocar
correctamente un enlace a otra página usando la constante SID.
Ejemplo 5. Contar el número de impresiones de un usuario
<?php if (!session_is_registered('count')) { session_register('count'); $count = 1; } else { $count++; } ?>
Hola, visitante. Has visto esta página <?php echo $count; ?> veces.
<?php # el <?php echo SID?> (Se puede usar <?=SID?> si short tag está activado) # es necesario para conservar el session id # en caso de que el usuario haya desactivado las cookies ?>
Para continuar, haga click <A HREF="nextpage.php?<?php echo SID?>">aquí</A>.
|
|
El <?=SID?> no es necesario si se ha usado
--enable-trans-sid al compilar PHP.
Nota:
Se asume que las URLs no relativas apuntan a sitios web externos,
y por tanto no se añade el SID, ya que pasar el SID a un servidor
diferente podría ocasionar un agujero de seguridad.
Para implementar el almacenamiento en bases de datos o en otro tipo
de almacenamiento, necesitará usar
session_set_save_handler()() para crear una
colección de funciones de almacenamiento a nivel de usuario.
El sistema de control de sesiones soporta varias opciones de
configuración que puede colocar en su archivo php.ini. Les daremos
un pequeño repaso.
session.save_handler define el nombre del
controlador que se usa para almacenar y recuperar los datos
asociados a la sesión. Su valor por defecto es files.
session.save_path define el argumento que se
pasa al controlador de almacenamiento. Si elige el controlador de
archivos por defecto, esta es la ruta donde los archivos se crean.
Por defecto es /tmp. Si la profundidad de la
ruta de session.save_path es mayor que 2, no se
llevará a cabo la recolección de basura.
| Aviso |
Si lo deja apuntando a un directorio con permiso de lectura por el
resto de usuarios, como /tmp (la opción por
defecto), los demás usuarios del servidor pueden conseguir robar
las sesiones obteniéndolas de la lista de archivos de ese directorio.
|
session.name especifica el nombre de la sesión que
se usa como nombre de la cookie. Sólo debería contener caracteres
alfanuméricos. Por defecto vale PHPSESSID.
session.auto_start especifica si el módulo de las
sesión inicia una sesión automáticamente al comenzar la petición. Por
defecto está 0 (desactivado).
session.cookie_lifetime especifica la duración de
la cookie en segundos que se manda al navegador. El valor
0 significa "hasta que se cierra el navegador", y
es el que se encuentra por defecto.
session.serialize_handler define el nombre del
controlador que se utiliza para guardar y restaurar los datos.
Actualmente se soportan un formato interno de PHP (cuyo nombre es
php) y WDDX (cuyo nombre es
wddx). WDDX sólo está disponible si PHP está
compilado con Soporte para WDDX. Por
defecto es php.
session.gc_probability especifica la probabilidad
de que se inicie la rutina gc (garbage collection - recoleción de
basura) en cada petición en porcentaje. Por defecto es 1.
session.gc_maxlifetime especifica el número de segundos
tras los cuales los datos se considerarán como 'basura' y serán
eliminados.
session.referer_check contiene la subcadena que usted
quiera que se compruebe en cada "HTTP Referer" (N.T.: Página desde donde
proviene el enlace a la página actual). Si el "Referer" fue enviado por
el cliente y la subcadena no se ha encontrado, el session id incrustado
será marcado como inválido. Por defecto es una cadena vacía.
session.entropy_file indica la ruta a un recurso
externo (un archivo) que se usará como fuente adicional de entropía
en el proceso de creación de session id's. Por ejemplo
/dev/random o /dev/urandom,
que están disponibles en muchos sistemas Unix.
session.entropy_length especifica el número
de bytes que serán leidos del archivo indicado más arriba. Por
defecto es 0 (desactivado).
session.use_cookies indica si el módulo
puede usar cookies para guardar el session id en el lado del
cliente. Por defecto está a 1 (activado).
session.cookie_path especifica la ruta a
colocar en session_cookie. Por defecto es /.
session.cookie_domain especifica el dominio
a establecer en session_cookie. Por defecto no se especifica
ninguno en ningún caso.
session.cache_limiter especifica el método
de control del caché a usar en las páginas de la sesión
(none/nocache/private/private_no_expire/public). Por defecto es
nocache (no guardar las páginas en el caché).
session.cache_expire especifica el
tiempo-de-vida de las páginas de la sesión que se encuentran en
el caché en minutos. No tiene efecto para el limitador nocache.
Por defecto vale 180.
session.use_trans_sid indica si la inclusión
del sid transparente está activada o no, si fue activada
compilando con
--enable-trans-sid. Por defecto está a
1 (activado).
url_rewriter.tags especifica qué etiquetas
html serán reescritas para incluir el session id si la inclusión
del sid transparente está activada. Las etiquetas por defecto son
a=href,area=href,frame=src,input=src,form=fakeentry
Nota:
El manejo de sesiones fue añadido en PHP 4.0.