Pregunta

Primero configuro mi script para que se ejecute incluso después de que finalice la solicitud HTTP

 ignore_user_abort(true);

luego elimine un poco de texto.

 echo "Thats all folks!";
 flush();

Ahora, ¿cómo puedo engañar al navegador para que piense que la solicitud HTTP ha terminado? para poder continuar haciendo mi propio trabajo sin que el navegador muestre " carga de página " ;.

 header(??) // something like this?
¿Fue útil?

Solución

Aquí se explica cómo hacerlo. Le dice al navegador que lea los primeros N caracteres de salida y luego cierre la conexión, mientras su script continúa ejecutándose hasta que esté listo.

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');
?>

Otros consejos

Los encabezados no funcionarán (son encabezados, por lo que vienen primero )

No conozco ninguna forma de cerrar la conexión http sin terminar el script, aunque supongo que hay una forma oscura de hacerlo.

Decirnos qué desea hacer después de que se realice la solicitud nos ayudaría a dar mejores sugerencias.

Pero en general, estaría pensando en uno de los siguientes:

1) Ejecute un script simple de línea de comandos (usando exec ()) que se vea así:

#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &

Luego, comience con su secuencia de comandos enlazada a http como:

<?PHP
exec('/path/to/my/script.sh');
?>

O:

2) Escriba otro programa (posiblemente un demonio que se ejecuta continuamente, o simplemente un script que se cronometra con tanta frecuencia), y descubra cómo su código solicitado puede pasarle las instrucciones. Podría tener una tabla de base de datos que ponga en cola las colas o intente que funcione con un archivo plano de algún tipo. También puede hacer que su script basado en la web llame a algún comando de línea de comandos que hace que su script fuera de solicitud ponga en cola algún trabajo.

Al final del día, no desea que su script se siga ejecutando después de la solicitud http. Suponiendo que está utilizando mod_php, eso significa que estará atascando un proceso de apache hasta que finalice el script.

Tal vez este comentario en particular en la página del manual de php.net ayude: http://www.php.net/manual/en/features.connection-handling.php#71172

Teóricamente, si HTTP 1.1 keep-alive está habilitado y el cliente recibe la cantidad de caracteres que espera del servidor, debe tratarlo como el final de la respuesta y continuar y procesar la página (manteniendo la conexión inmóvil) abrir.) Intente enviar estos encabezados (si no puede habilitarlos de otra manera):

Connection: keep-alive
Content-Length: n

Donde n es la cantidad de caracteres que ha enviado en el cuerpo de la respuesta (el búfer de salida puede ayudarlo a contar eso). Lamento no tener tiempo para probar esto yo mismo. Solo estoy agregando la sugerencia en caso de que funcione.

La mejor manera de lograr esto es usando el buffer de salida. PHP envía los encabezados cuando está bueno y listo, pero si ajusta su salida al navegador con ob_ * puede controlar los encabezados en cada paso del camino.

Si lo desea, puede mantener una página renderizada en el búfer y enviar encabezados hasta que salga el sol en China. Esta práctica es la razón por la que puede ver muchas etiquetas de apertura <?php, pero no hay etiquetas de cierre hoy en día. Evita que la secuencia de comandos envíe encabezados prematuramente, ya que podría haber algunos que considerar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top