30 de abril de 2015

Sessiones PHP

Por omisión, PHP usa el gestor interno de almacenamiento files, el cual se establece mediante session.save_handler. Éste guarda los datos de sesión en el servidor en la ubicación especificada por la directiva de configuración session.save_path, pode defecto se encuentra en session.save_path = "c:/wamp/tmp" Para utilizar sesiones mediante el mecanismo propio de PHP (es decir, sin necesidad de crear funciones propias), la directiva session.save_handler del archivo de configuración php.ini debe tener el valor files. [Session] ; Handler used to store/retrieve data. ; http://php.net/session.save-handler session.save_handler = files Para el manejo de las sesiones tenemos un abanico de funciones que nos facilitaran su uso. Todas la variables de sesión son accesibles mediante arrays en la variable global $_SESSION. session_start: inicializa una sesión y crea el valor o identificador de la sesión. session_id: devuelve el valor de la sesión actual. session_regenerate_id: genera un nuevo identificador para la sesión actual. session_unset: limpia todas la variables de sesión registradas. session_destroy: elimina todas la variables de sesión. En PHP, las sesiones se crean mediante la función session_start(). Si la sesión no existía, esta función crea la sesión y le asocia un identificador de sesión único. Si la sesión ya existía, esta función permite que la página tenga acceso a la información vinculada a la sesión.
<?php
session_start();
?>
Como en el caso de las cookies, hay que tener la precaución de utilizar la función session_start() antes de empezar a escribir el contenido de la página, porque si no PHP producirá un aviso y no se creará la sesión. El motivo es que el idetificador de sesión se utiliza en las cabeceras de respuesta HTTP y las cabeceras se envían antes del texto de la página. Es decir, cuando PHP encuentra una instrucción que escribe texto, cierra automáticamente la cabecera; si a continuación PHP encuentra en el programa la función session_start(), da un aviso porque ya se han enviado las cabeceras y no se crea la sesión. El nombre de la sesión se encuentra en php.ini y está especificado a PHPSESSID, este valor se puede cambiar a uno más representativo desde el código teniendo en cuenta que debe especificarse en cada página que inicie sesión ; Name of the session (used as cookie name). ; http://php.net/session.name session.name = PHPSESSID El ejemplo siguiente muestra código incorrecto, ya que utiliza la función session_start() después de haber escrito texto, y el mensaje de aviso generado por PHP.
<?php
// Este código es incorrecto, la cabecera se crea después de crear texto
print "

Hola

\n"; session_start(); ?>
Genera la siguiente salida:

Hola


Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at ejemplo.php:3) in ejemplo.php on line 4
En el fichero .INI hay un apartado dedicado a las sesiones; en el cual se definen ciertos valores que determinarán el comportamiento de tales. - session.use_cookies Indica si se usarán las cookies para almacenar el SID defecto: 1 - session.name Indica el nombre de la cookie que indicará el SID defecto: PHPSESSID - session.auto_start Indica si la sesión se inicializa al empezar el script automáticamente defecto: 0 - session.cookie_lifetime Indica el tiempo de vida de la cookie (si aplicable) Si 0, caduca al cerrar el explorador. defecto: 0 - session.cookie_path Indica el path o los directorios y sub directorios dentro de un sitio web en los que la cookie es válida, el valor por default es / y significa que la cookie es valida para todos los directorios y sub directorios de tu sitio web, pero si se desea que por ejemplo solo sea valida para el subdirectorio /listas dentro de www.ejemplo.com/libros entonces se debe especificar /libros en el sesión.cookie_path - session.cookie_domain Indica el dominio de la cookie para que sea válida, por defecto será el host del dominio en que se creo la sesión. - session.serialize_handler Indica el handler usado para serializar la sesión defecto: php - session.gc_probability Indica el número de veces de cada 100 que se ejecuta el recolector de basura de las sesiones. Éste proceso borra los ficheros de las sesiones que hallan caducado ya. defecto: 1 cada 100 (1%) - session.gc_maxlifetime Indica el número de segundos que deben haber pasado desde la última actualización para que se considere basura. defecto: session.gc_maxlifetime - session.referer_check Indica la cadena que debe contener la variable $HTTP_REFERER (variable que contiene la url que ha referenciado a ésta página (No todos los navegadores envían esta información)) - session.entropy_length Indica el número de bytes que se leerán del fichero - session.entropy_file Indica como crear el fichero defecto: /dev/urandom - session.cache_limiter Determina el tipo de caché HTTP nocache private public defecto: nocache - session.cache_expire Indica el tiempo en minutos para que caduque el documento defecto: 180 - session.use_trans_sid Indica si se utilizará el transid, que modificará automáticamente los enlaces por GET. defecto: 1 Crear variables de Session Cuando una página ha creado una sesión o ha accedido a una sesión ya existente mediante session_start(), la página tiene acceso a la matriz $_SESSION que contiene las variables de esa sesión, los cuales se mantienen y son accesibles desde cualquier página que inicie sesión. Si deseamos crear variables de sesión para que se puedan utilizar a través de diferentes páginas inicializamos el manejo de sesiones con la función session_start y luego guardamos el dato deseado como variable de sesión utilizando la variable global $_SESSION.
<?php
// home.php
session_start();
if (!isset($_SESSION["pais"])) {
    $_SESSION["country"] = "El Salvador"; 
}
?>
El ejemplo siguiente muestra dos páginas. La primera página guarda información en $_SESSION y la segunda la utiliza.
<?php
//Pagina1.php
session_start();
$_SESSION["nombre"] = "Pepito Conejo";
print "

Se ha guardado su nombre.

\n"; ?>
<?php
//pagina2.php
session_start();
print "

Su nombre es $_SESSION[nombre].

\n"; ?>
Los nombres de los índices de la matriz $_SESSION tienen que cumplir las mismas reglas que los nombres de las variables, es decir, que el primer carácter debe ser una letra o un guión bajo (_). Eliminando Datos de Sesion Los valores de $_SESSION se borran como en cualquier otra matriz mediante la función unset(). Uso de la función session_destroy para cerrar la sesión en PHP
<?php
  session_start();
  unset($_SESSION["nombre_usuario"]); 
  unset($_SESSION["nombre_cliente"]);
  session_destroy();
  header("Location: index.php");
  exit;
?>
Un detalle importante que distingue a las sesiones de las cookies es que: en el caso de las cookies, cuando una página pide al navegador que cree una cookie, el valor de la cookie no está disponible en $_COOKIE en esa página. Lo estará en páginas posteriores, cuando el navegador pida otra página y envíe el valor en la petición. en el caso de las sesiones, cuando una página crea un valor en $_SESSION, ese valor está disponible en esa misma página. El usuario puede destruir la sesión cerrando el navegador, pero las sesiones también se pueden destruir por programa mediante la función session_destroy(). Tipos de cookies. Cookies de sesión - son archivos de cookies temporales, que se borran cuando cierras el navegador. Cuando reinicias el navegador y vuelves al sitio que creó la cookie, la página web no te reconocerá. Tendrás que volver a iniciar sesión (si es necesario hacerlo) o seleccionar tus preferencias y temas de nuevo si el sitio utiliza esas funciones. Una cookie de sesión nueva se generará y almacenará tu información de navegación, permaneciendo activa hasta que abandones la página y cierres el navegador. Más sobre las cookies de sesión. Cookies permanentes estos archivos permanecen en una subcarpeta de tu navegador hasta que las eliminas manualmente o tu navegador las elimina de acuerdo con el período de duración establecido en el archivo de la cookie permanente más sobre cookies permanentes. session_set_cookie_params session_set_cookie_params — Establecer los parámetros de la cookie de sesión Establece los parámetros de la cookie definidos en el archivo php.ini. El efecto de esta función sólo se mantiene para la duración del script. Por lo tanto, se necesita llamar a session_set_cookie_params() por cada petición y antes de llamar a session_start(). Esta función actualiza los valores ini en tiempo de ejecución de las claves de configuración ini de PHP que pueden ser recuperadas con la función ini_get(). lifetime Tiempo de vida de la cookie de sesión, definido en segundos. path Ruta en el dominio donde la cookie trabajará. Use una barras simple ('/') para todas las rutas en el dominio. domain Dominio de la cookie, por ejemplo 'www.php.net'. Para hacer las cookies visibles en todos los sub-dominios, el dominio debe ser prefijado con un punto, como '.php.net'. secure Si es TRUE la cookie sólo será enviada sobre conexiones seguras. httponly Si es TRUE PHP intentará enviar la bandera httponly cuando se establezca la cookie de sesión. session_get_cookie_params session_get_cookie_params — Obtener los parámetros de la cookie de sesión Descripción array session_get_cookie_params ( void ) Obtiene los parámetros de la cookie de sesión. Valores devueltos Devuelve una matriz con la información de la cookie de sesión actual, la matriz contiene los siguientes elementos: "lifetime" - El tiempo de vida de la cookie en segundos. "path" - La ruta donde se almacena la información. "domain" - El dominio de la cookie. "secure" - La cookie debería ser enviada solamente sobre conexiones seguras. "httponly" - La cookie sólo puede ser accedida a través del protocolo HTTP.
<?php
function sec_session_start()
{
        $session_name = 'secure_session_main'; // Set a custom session name
        $secure = false; // Set to true if using https.
        $httponly = true; // This stops javascript being able to access the session id.
        ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies.
        $cookieParams = session_get_cookie_params(); // Gets current cookies params.
        session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"],          $cookieParams["domain"], $secure, $httponly);  
        session_name($session_name); // Sets the session name to the one set above.
        session_start(); // Start the php session
        session_regenerate_id(TRUE); // regenerated the session, delete the old one.
}
?>