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="/mambo/documentacion-manual_php-pagina-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_