ACTUALIZACIÓN
La manera de manejar este caso es una combinación de búferes de salida y las cabeceras HTTP apropiados.
Desde el HTTP/1.1 Specification Section 14.10:
HTTP/1.1 define el "cierre" opción de conexión para que el remitente señal de que la conexión se cerrará después de la finalización de la respuesta .
lo tanto, si se pasa a lo largo de un HTTP Content-Length cabecera, además de Connection: close, el navegador sabe para cerrar la conexión después de que se reciba la longitud de respuesta especificada:
- Buffer TODO el script de salida para que conserve la capacidad de enviar encabezados
- Una vez que tenga los datos completos de salida, envíe los encabezados correspondientes al cliente
- Continúe r procesamiento ... pero no intente enviar resultados o recibirá errores porque se han enviado encabezados.
Además, tenga cuidado ya que puede ejecutar contra los límites de tiempo de ejecución del script en el servidor web SAPI si realiza demasiado procesamiento. Finalmente, debe decirle a PHP que ignore un "abortar usuario" en este script en particular usando ignore_user_abort()
porque el navegador cerrará la conexión como resultado de lo que está haciendo y desea que PHP continúe procesando.
<?php
ignore_user_abort();
ob_start();
// do stuff, generate output
// get size of the content
$length = ob_get_length();
// tell client to close the connection after $length bytes received
header('Connection: close');
header("Content-Length: $length");
// flush all output
ob_end_flush();
ob_flush();
flush();
// close session if you have one ...
// continue your processing tasks ...
?>
que te pueden examinar la sección del manual de PHP en Connection handlingdocs.
Alternativamente, ¿por qué no iniciar el almacenamiento en búfer de salida? Luego puede capturar toda la salida que se enviará y luego decidir si realmente desea hacer algo con ella.
<?php
echo 'before output buffering';
ob_start();
echo 'after output buffering';
$output = ob_get_contents();
// script's only output to this point will be 'before output buffering'
// I changed my mind, send the output ...
ob_end_flush();
?>
¿Por qué necesita para hacer esto? ¿Puedes publicar un poco de tu código para ayudarnos a entender un poco más? –
+1 a lo que dijo Jonathan. Cuéntanos un poco más sobre por qué quieres hacer esto. –