martes, 8 de mayo de 2012

5. SESION: Uso de Sesiones PHP

·           Declaración de Sesiones

Las sesiones son simplemente variables que mantienen su valor para cada usuario a lo largo de toda la visita a nuestra página web, no como las variables normales, que sólo están activas durante la ejecución del script.. Por ejemplo, si tenemos la variable $nombre = 'Jose'; ésta seguirá activa durante toda la ejecución del script, pero al cambiar de página ésta desaparecerá. En cambio una variable de sesión permanecerá activa y con el valor que le hayamos asignado durante toda la visita del usuario.

Para utilizar variables de sesión es tan sencillo como llamar a session_start() al principio de la página, antes de cualquier salida (antes de <html> y cualquier otra cosa que se muestre en pantalla) y usar la variable superglobal $_SESSION para almacenar valores.

Vamos a hacer un ejemplo sencillo con dos páginas, en una definiremos una variable de sesión y en la otra veremos su valor.

Página 1:

<?php   
session_start();  
$_SESSION['nombre'] = 'Juan';
?>

Página 2:

<?php 
session_start(); 
echo "El nombre es: ".$_SESSION['nombre'];
?>

Guardamos el código en pagina1.php y pagina2.php respectivamente.

Siempre tenemos que llamar a session_start() antes de usar las sesiones, ya sea para acceder a ellas o para almacenar valores. Si ejecutamos la primera página veremos que aparece en blanco, pero si seguidamente vamos a la página 2 veremos que aparece "El nombre es: Juan", sin embargo, "Juan" no aparece por ninguna parte en el código de la pagina2.php, todo es obra de las sesiones.

Esto nos puede ser útil por ejemplo para identificar a un usuario. Primero comprobaríamos en la base de datos si el usuario y contraseña introducido es correcto y si es así haríamos algo del tipo $_SESSION['logged'] = true. Luego sólo tendríamos que comprobar esta variable de sesión.

·           Funciones para el Manejo de Sesiones

session_cache_expire


(PHP 4 >= 4.2.0, PHP 5)
session_cache_expire -- Devuelve la caducidad actual del caché
Descripción
int session_cache_expire ( [int nueva_caducidad_cache] )

session_cache_expire() devuelve la caducidad actual del caché. Si se proporciona nueva_caducidad_cache, se reemplazará la caducidad actual con nueva_caducidad_cache.

session_cache_limiter


(PHP 4 >= 4.0.3, PHP 5)
session_cache_limiter -- Lee y/o cambia el limitador del caché actual
Descripción
string session_cache_limiter ( [string limitador_del_cache] )

session_cache_limiter() devuelve el nombre del limitador de caché actual. Si se especifica limitador_del_cache, el nombre del limitador de caché actual se cambia al nuevo valor.

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. Cambiando el limitador de caché a nocache, por ejemplo, impedirá cualquier tipo de almacenamiento en el caché por parte del cliente. Un valor de public, en cambio, permitiría el almacenamiento en el caché. Tambié se puede cambiar a private, que es un poco más restrictivo que el public.

En el modo private, la cabecera Expire (caducidad) enviada al cliente puede confundir a algunos navegadores incluyendo Mozilla. Puede evitar este problema con el modo private_no_expire. La cabecera Expire nunca se envía al cliente en este modo.

    Nota: private_no_expire fue añadida en PHP 4.2.0dev.


Al comenzar la ejecución del script, el limitador de caché se reestablece al valor por defecto guardado en session.cache_limiter. De este modo, es necesario llamar a session_cache_limiter() en cada petición (y antes de llamar a session_start()).

Ejemplo 1. Ejemplos con session_cache_limiter()
<?php

# cambia el limitador del cach&eacute; a 'private'

session_cache_limiter('private');
$cache_limiter = session_cache_limiter();

echo "El limitador de cach&eacute; est&aacute; puesto ahora en $cache_limiter<p>";
?>

session_commit


(PHP 4 >= 4.3.11, PHP 5)
session_commit -- Alias of session_write_close()
Descripción

This function is an alias of: session_write_close().

session_decode


(PHP 4, PHP 5)
session_decode -- Decodifica los datos de una sesión a partir de una cadena
Descripción
bool session_decode ( string datos )

session_decode() decodifica los datos de una sesión que se encuentran en datos, creando las variables guardadas en la sesión.

session_destroy

 

(PHP 4, PHP 5)
session_destroy -- Destruye todos los datos guardados en una sesión
Descripción
bool session_destroy ( void )

session_destroy() destruye todos los datos asociados con la sesión actual. No destruye ninguna de las variables globales asociadas a la sesión ni la cookie.

Esta función devuelve TRUE si se ha destruido la sesión correctamente y FALSE si ha habido algún problema al intentarlo.

Ejemplo 1. Destrucción de una sesión
<?php

// Inicializa de la sesi&oacute;n.
// Si est&aacute; usando session_name("algo"), &iexcl;no lo olvide ahora!
session_start();
// Destruye todas las variables de la sesi&oacute;n
session_unset();
// Finalmente, destruye la sesi&oacute;n
session_destroy();

?>

session_encode


(PHP 4, PHP 5)
session_encode --  Codifica los datos de la sesión actual en una cadena
Descripción
string session_encode ( void )

session_encode() devuelve una cadena con el contenido de la sesión actual en su interior.

 

session_get_cookie_params


(PHP 4, PHP 5)
session_get_cookie_params --  Obtiene los parámetros de la cookie de la sesión
Descripción
array session_get_cookie_params ( void )

La función session_get_cookie_params() devuelve un vector con información sobre la cookie de la sesión actual, conteniendo los siguientes elementos:

    "lifetime" - La duración de la cookie.

    "path" - La ruta donde se guarda la información.

    "domain" - El dominio de la cookie.

    "secure" - La cookie debe ser enviada sólo bajo conexiones seguras. (Este elemento fue añadido en PHP 4.0.4.)

session_id


(PHP 4, PHP 5)
session_id -- Lee y/o cambia el session id actual
Descripción
string session_id ( [string id] )

session_id() devuelve el session id de la sesión actual. Si se especifica un id, reemplazará el session id actual.

También se puede utilizar la constante SID para recuperar el nombre y el session id de la sesión actual como una cadena adecuada para añadir a las URLs.

session_is_registered


(PHP 4, PHP 5)
session_is_registered --  Comprueba si una variable está registrada en la sesión
Descripción
bool session_is_registered ( string nombre )

session_is_registered() devuelve TRUE si hay una variable registrada en la sesión actual cuyo nombre es nombre.

    Nota: Si utiliza $_SESSION (o $HTTP_SESSION_VARS con PHP 4.0.6 o inferior), use isset() para comprobar si una variable está registrada en $_SESSION.

Atención

Si utiliza $HTTP_SESSION_VARS/$_SESSION, no use session_register(), session_is_registered() ni session_unregister().

session_module_name


(PHP 4, PHP 5)
session_module_name -- Lee y/o cambia el módulo de la sesión actual
Descripción
string session_module_name ( [string módulo] )

session_module_name() devuelve el nombre del módulo de la sesión actual. Si se especifica módulo, se usará ese módulo en su lugar.

session_name


(PHP 4, PHP 5)
session_name -- Lee y/o cambia el nombre de la sesión actual
Descripción
string session_name ( [string nombre] )

session_name() devuelve el nombre de la sesión actual. Si se especifica un nombre, el nombre de de la sesión actual se cambia a este valor.

El nombre de la sesión hace referencia al session id utilizado en las cookies y en las URLs. Debería contener únicamente caracteres alfanuméricos; también debería ser corto y descriptivo (p.ej. para usuarios con los avisos de las cookies activados). El nombre de la sesión se restaura al valor guardado por defecto en session.name al comenzar la petición. Así, pues, es necesario llamar a session_name() en cada petición (y antes de llamar a session_start() o a session_register()).

Ejemplo 1. Ejemplos de session_name()
<?php

// Cambiar el nombre de la sesi&oacute;n a WebsiteID

$nombre_anterior = session_name("WebsiteID");

echo "El anterior nombre de la sesi&oacute;n era $nombre_anterior<p>";
?>

session_regenerate_id


(PHP 4 >= 4.3.2, PHP 5)
session_regenerate_id --  Actualizar el id de sesión actual con una recién generada
Descripción
bool session_regenerate_id ( [bool borrar_sesion_vieja] )

session_regenerate_id() reemplazará la id de sesión actual con una nueva, y conservará la información de sesión actual.
Lista de parámetros

borrar_sesion_vieja

    Indica si se debe eliminar el archivo viejo de sesión asociado o no. Su valor predeterminado es FALSE.

Valores retornados

Devuelve TRUE si todo se llevó a cabo correctamente, FALSE en caso de fallo.
Registro de cambios

Versión               Descripción
4.3.3      Desde esta versión, si las cookies de sesión están habilitadas, el uso de session_regenerate_id() también enviará una nueva cookie de sesión con el nuevo id de sesión.
5.1.0      Se agregó el parámetro borrar_sesion_vieja.

Ejemplos

Ejemplo 1. Un ejemplo de session_regenerate_id()
<?php
session_start();

$id_sesion_antigua = session_id();

session_regenerate_id();

$id_sesion_nueva = session_id();

echo "Sesi&oacute;n Vieja: $id_sesion_antigua<br />";
echo "Sesi&oacute;n Nueva: $id_sesion_nueva<br />";

print_r($_SESSION);
?>

session_register


(PHP 4, PHP 5)
session_register --  Registrar una o más variables globales con la sesión actual
Descripción
bool session_register ( mixed nombre [, mixed ...] )

session_register() acepta un número variable de argumentos, cualquiera de los cuales puede ser o una cadena que contiene el nombre de una variable, o una matriz que consista de nombres de variables u otras matrices. Para cada nombre, session_register() registra la variable global con ese nombre en la sesión actual.

Atención

Si desea que su script funcione independientemente de register_globals, necesita usar en su lugar la matriz $_SESSION, dado que las entradas de $_SESSION son registradas automáticamente. Si su script usa session_register(), no funcionará en entornos en donde la directiva PHP register_globals esté deshabilitada.

    register_globals: Nota importante: Desde PHP 4.2.0 el valor por defecto de la directiva register_globals es off. La comunidad PHP anima a todos a no confiar en esta directiva y usar en su lugar superglobals.

Atención

Esto registra una variable global. Si desea registrar una variable de sesión desde el interior de una función, necesita asegurarse de hacerla global usando la palabra clave global o la matriz $GLOBALS[], o usar las matrices de sesión especiales, como se anota a continuación.

Atención

Si está usando $_SESSION (o $HTTP_SESSION_VARS), no use session_register(), session_is_registered(), ni session_unregister().

Esta función devuelve TRUE cuando todas las variables son registradas satisfactoriamente en la sesión.

Si session_start() no fue llamada antes de que ésta función sea llamada, se realizará un llamado implícito a session_start() sin parámetro alguno. $_SESSION no imita este comportamiento y requiere session_start() antes de su uso.

Puede crear también una variable de sesión, simplemente definiendo el miembro apropiado de $_SESSION o la matriz $HTTP_SESSION_VARS (PHP < 4.1.0).

<?php
// El uso de session_register() es considerado obsoleto
$barney = "Un dinosaurio grande y violeta.";
session_register("barney");

// Se prefiere el uso de $_SESSION, a partir de PHP 4.1.0
$_SESSION["zim"] = "Un invasor de otro planeta.";

// El modo antiguo era usar $HTTP_SESSION_VARS
$HTTP_SESSION_VARS["bob_esponja"] = "&Eacute;l tiene pantalones cuadrados.";
?>

    Nota: Actualmente es imposible registrar variables de recurso en una sesión. Por ejemplo, no puede crear una conexión a una base de datos y almacenar la id de conexión como una variable de sesión y esperar que la conexión aun sea válida la próxima vez que la sesión sea restaurada. Las funciones PHP que devuelven un recurso se identifican por tener un tipo de retorno de resource en su definicón de función. Una lista de funciones que devuelven recursos está disponible en el apéndice tipos de recurso.

    Si $_SESSION (o $HTTP_SESSION_VARS para PHP 4.0.6 o versiones anteriores) es usado, asigne valores a $_SESSION. Por ejemplo: $_SESSION['var'] = 'ABC';

session_save_path


(PHP 4, PHP 5)
session_save_path -- Lee y/o cambia la ruta donde se guardan los datos de la sesión actual
Descripción
string session_save_path ( [string path] )

session_save_path() devuelve la ruta del directorio usado actualmente para guardar los datos de la sesión. Si se especifica path, se cambiará la ruta donde se guardan los datos.

    Nota: En algunos sistemas operativos, puede que quiera especificar una ruta en un sistema de archivos que maneja muchos archivos pequeños de forma eficiente. Por ejemplo, en Linux, reiserfs puede dar un rendimiento mejor que ext2fs.


session_set_cookie_params


(PHP 4, PHP 5)
session_set_cookie_params --  Cambia los parámetros de la cookie de la sesión
Descripción
void session_set_cookie_params ( int duración [, string path [, string dominio [, bool segura]]] )

Cambia los parámetros de la cookie definidos en el archivo php.ini. El efecto de esta función sólo dura hasta que termina el script.

    Nota: El parámetro segura fue añadido en PHP 4.0.4.

 

session_set_save_handler


(PHP 4, PHP 5)
session_set_save_handler --  Establece unas funciones para el almacenamiento de los datos de la sesión a nivel de usuario
Descripción
bool session_set_save_handler ( string abrir, string cerrar, string leer, string escribir, string destruir, string gc )

session_set_save_handler() establece las funciones que se utilizan a nivel de usuario para el almacenamiento y recuperación de los datos asociados a una sesión. Es lo más útil cuando se prefiere utilizar otro método de almacenamiento distinto del proporcionaddo por las sesiones de PHP. p.ej. Almacenar los datos de la sesión en una base de datos local. Devuelve TRUE si todo se llevó a cabo correctamente, FALSE en caso de fallo.

    Nota: Debe cambiar la opción session.save_handler en la configuración a user en su archivo php.ini para que session_set_save_handler() tenga efecto.

    Nota: El manejador "escribir" no se ejecuta hasta que se cierra la salida. Por ello, la salida de las sentencias que coloquemos en el manejador "escribir" para el depurado nunca será enviadas al navegador. Si se necesita producir una salida para el depurado, se sugiere que la salida se produzca en un archivo.

El siguiente ejemplo proporciona almacenamiento de las sesiones basado en archivos de forma similar al manejador de sesiones por defecto de PHP files. Este ejemplo puede ser extendido fácilmente para cubrir el almacenamiento en bases de datos usando su motor de soporte de bases de datos de PHP favorito.

La función de lectura debe devolver siempre una cadena para que el manejador de escritura funcione como se espera. Devuelva una cadena vacía si no hay ningún dato a leer. Los valores devueltos de otros manejadores son convertidos a una expresión booleana. TRUE si todo ha ido correctamente, FALSE si ha habido algún problema.

Ejemplo 1. Ejemplo de session_set_save_handler()
<?php
function abrir ($save_path, $session_name) {
  global $sess_save_path, $sess_session_name;
      
  $sess_save_path = $save_path;
  $sess_session_name = $session_name;
  return(true);
}

function cerrar() {
  return(true);
}

function leer ($id) {
  global $sess_save_path, $sess_session_name;

  $sess_file = "$sess_save_path/sess_$id";
  if ($fp = @fopen($sess_file, "r")) {
    $sess_data = fread($fp, filesize($sess_file));
    return($sess_data);
  } else {
    return(""); // Debe devolver "" aqu&iacute;.
  }

}

function escribir ($id, $sess_data) {
  global $sess_save_path, $sess_session_name;

  $sess_file = "$sess_save_path/sess_$id";
  if ($fp = @fopen($sess_file, "w")) {
    return(fwrite($fp, $sess_data));
  } else {
    return(false);
  }

}

function destruir ($id) {
  global $sess_save_path, $sess_session_name;
      
  $sess_file = "$sess_save_path/sess_$id";
  return(@unlink($sess_file));
}

/***********************************************
* ATENCI&Oacute;N - Necesitar&aacute; implementar alg&uacute;n     *
* tipo de rutinas recolectoras de basura aqu&iacute; *
***********************************************/
function rb ($maxlifetime) {
  return true;
}

session_set_save_handler ("abrir", "cerrar", "leer", "escribir", "destruir", "rb");

session_start();

// proceed to use sessions normally

?>

session_start


(PHP 4, PHP 5)
session_start -- Inicializar los datos de una sesión
Descripción
bool session_start ( void )

session_start() crea una sesión (o la continúa basandose en el session id pasado por GET o mediante una cookie).

Si desea usar una sesión con un nombre en concreto, debe llamar a session_name() antes de llamar a session_start().

Esta función siempre devuelve TRUE.

    Nota: Si está usando sesiones basadas en las cookies, debe llamar a session_start() antes de que haya ninguna salida al navegador.

session_start() registrará un manejador de salida interno para la reescritura de las URL's si trans-sid está activado. Si un usuario utiliza ob_gzhandler o algo como ob_start(), el orden del manejador de salida es importante para que la salida sea la adecuada. Por ejemplo, el usuario debe registrar ob_gzhandler antes de iniciar la sesión.

    Nota: Se recomienda utilizar zlib.output_compression en lugar de ob_gzhandler

session_unregister


(PHP 4, PHP 5)
session_unregister --  Desregistrar una variable de la sesión actual
Descripción
bool session_unregister ( string nombre )

session_unregister() desregistra (olvida) la variable global llamada nombre de la sesión actual.

Esta función devuelve TRUE cuando la variable es eliminada de la sesión correctamente.

    Nota: Si utiliza $_SESSION (o $HTTP_SESSION_VARS con PHP 4.0.6 o inferior), use unset() para eliminar una variable de la sesión actual.


Atención

Esta función no borra la variable global correspondiente a nombre, sólo evita que la variable sea guardada como parte de la sesión. Debe llamar a unset() para eliminar la variable global correspondiente.

Atención

Si está trabajando con $HTTP_SESSION_VARS/$_SESSION, no utilice session_register(), session_is_registered() ni session_unregister().

session_unset


(PHP 4, PHP 5)
session_unset --  Elimina todas las variables de la sesión
Descripción
void session_unset ( void )

La función session_unset() elimina y libera el espacio ocupado por todas las variables de la sesión actual registradas.

    Nota: Si utiliza $_SESSION (o $HTTP_SESSION_VARS con PHP 4.0.6 o inferior), use unset() en su lugar para desregistrar una variable de la sesión. p.ej. $_SESSION = array();


session_write_close


(PHP 4 >= 4.0.4, PHP 5)
session_write_close -- Escribe los datos de la sesión y la finaliza
Descripción
void session_write_close ( void )

Finaliza la sesión actual y guarda sus datos

Los datos de la sesió se suelen guardar tras finalizar la ejecución de su script sin necesidad de llamar a session_write_close(), pero como los datos de la sesió están bloqueados para evitar escrituras concurrentes, sólo un script puede trabajar con una sesión a la vez. Cuando se usan framesets junto con sesiones, podrá comprobar que los frames se cargan uno a uno debido a este bloqueo. Puede reducir el tiempo necesario para cargar los frames finalizando la sesión tan pronto como haya terminado los cambios a las variables de la sesión.

1 comentario: