Ver Mensaje Individual
  #16 (permalink)  
Antiguo 17/12/2008, 06:12
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: PHP funcion header

@superdober, la verdad no sé si eres el usuario que originalmente hizo la pregunta, o eres otro con otra pregunta Y me da lata subir hasta arriba porque el mensaje es muy largo. Pero si eres otro, entonces te recomiendo para después hacer tus preguntas en un nuevo tema.

El problema, como lo hemos estado discutiendo en todo este tema, es que una vez que se han enviado cabeceras (headers) al navegador, el servidor ya no interpreta ni recibe/envia ninguna otra. Y entendemos por cabeceras: texto (HTML), algún otro tipo de contenido, e incluso una llamada a flush() que sólo envíe las cabeceras aunque aún no haya salidas "físicas". Por lo tanto, no puedes usar prints ni echos, ni nada de eso antes de llamar a header().

@GatorV, pero hay que establecer diferencias entre un pedido HTTP que hace el navegador, la rspuesta que este espera, y el procesamiento que el servidor está ejecutando en "backstage" que genera esta respuesta.

Como bien dices, una vez que el cliente recibe la respuesta a la petición, este puede optar por redirigir inmediatamente (si el header es de redirección), o cortar la conexión HTTP, o esperar a que esta termine del lado del servidor (Cómo sabe? Hay algún header() que se envía que indica que el script terminó de ejecutarse?). Al haber un time_limit insuficiente para que se termine de ejecutar el script, obviamente no todo el código se ejecutará al final. Pero eso pasa en todos los casos, aún sin que se envíe una cabecera de redirección. Como decía, el script termina de ejecutarse y envía un "indicador?" al cliente indicándole que la petición HTTP está completa, y el cliente procede.

Pero si el cliente no espera esta "respuesta final", corta la conexión, pero eso implica que el servidor HTTP detenga el procesamiento? Hice una prueba sencilla:

Código php:
Ver original
  1.  
  2. echo 'abcd'; // Salida
  3.  
  4. flush(); // Para asegurarme que la salida sea enviada al navegador
  5. sleep(20); // Más procesamiento
  6.  
  7. $_SESSION['foo'] = headers_sent(); // Una variable de sesión.
Para emular el comportamiento de un navegador que cierre la conexión al recibir los primeros headers cerré la pestaña que hacía el request. Abrí en una nueva otra página que me imprima las variables de sesión existente (Las sesiones se comparten entre pestañas), y oh! sorpresa. El script no cargaba. Y no cargaba hasta que pasaron los 20 segundos del sleep del primero, tras lo cual me mostró la variable de sesión foo con el valor boobleano true. Comencé a probar de diversas maneras, y llegué a la conclusión de que el script sigue ejecutándose hasta que se termina o es terminado, o en todo caso hasta que el tiepo se le agota, pero no tiene mucho que ver con el comportamiento que tiene el cliente frente a las primeras cabeceras enviadas. Y que requests sucesivos y muy seguidos no cortan el procesamiento previo sin aún no ha terminado.

Eso de que tenga que esperar a que uno termine, imagino que debe estar en la capacidad del servidor de procesar múltiples request simultaneamente, pero este ejemplo me sirvió para comprobar que el terminar una conexión cliente-servidor no hace que el procesamiento del script por parte el servidor termine.