Tema: Headers / Descargas forzadas
Pregunta: CASO1: Cuando uso un header() para redireccionar, no se guardan los cambios en las variables de session.
CASO2: Mi script de control de desarcagas funciona pero no permite navegar el sitio hasta que el download finaliza
Respuesta:
Para el CASO 1 lo primero es asegurarse que el SID (Identificador Unico de Session) se esté propagando por cookies y no por URL, ya que si este se está propagando por cookies y a su vez el browser no está siendo capaz de aceptar las cookies, esta puede ser la causa de la pérdida de valores de session. (Tener a bien realizar este control antes de utilizar la información a continuación)
En ambos casos la solucion es utilizar el comando session_write_close(); que forzara el guardado de los cambios en session (variables) y cerrará la sesion sin destruirla (es decir, cuando vuelvo a hacer un session_start() la misma session sigue en pie).
Este problema sucede ya que PHP guarda los cambios en las variables de session cuando el
script finaliza, y dado que un header() no significa el fin del script (sino un comando más), es necesario "forzar" el guardado y cierre de sesion.
Recordar que siempre se debe respetar el orden de los comandos de sesion, por ejemplo:
Código PHP:
session_start();
// Trabajamos con las variables de session
$_SESSION['contador']++;
$_SESSION['time'] = time();
(...)
// Antes de redireccionar, guardamos la session
session_write_close();
//redireccionamos
header("Location: /nueva_pagina.php");
Para el caso 2 haremos exactamente lo mismo. Colocaremos un "session_write_close()" antes de llamar a la función header(); (que para este caso, nos estará redireccionando al archivo a descargarse).
Espero sirva, más info en ar2.php.net buscar término: header()
[Edit: Gracias cluster por tu atención]