Tengo un script php que usa cURL y tarda unos 10-15 minutos en ejecutarse. Lo que hace, analiza aproximadamente 1000 páginas buscando coincidencias específicas y en todo el script tengo mensajes de diagnóstico repetidos, como "Pasar a la página siguiente", "Encontré una coincidencia", "Error al cargar la página" ... La forma en que funciona ahora (y la forma en que es normal) es que se ejecuta durante 10 minutos y solo luego escupe todos mis mensajes personalizados. Me gustaría poder mostrar esos mensajes a medida que ocurren, no cuando el script se termina de ejecutar. Estaba pensando que algo como AJAX lo haría, pero no estoy seguro de cómo funcionaría. Cualquier consejo es muy apreciado. Gracias.Mensajes de eco mientras el script php aún se ejecuta
Respuesta
Entonces, esta es una publicación anterior, pero encontré una solución para esto. Como también tengo que hacer lo mismo, imprima cuando el script aún se está ejecutando. Ninguna respuesta de aquí ayudó. En primer lugar, estoy usando el servidor Win32 (producción) y XAMPP como local para las pruebas. Este ejemplo es solo una prueba de concepto y se puede modificar a su gusto.
<?php
ob_implicit_flush(true);
for($i=1; $i<=10; $i++){
echo "$i ...<br>";
for($k = 0; $k < 40000; $k++) echo ' ';
sleep(1);
}
?>
Entonces, abrimos el buffer de salida como implícito. Luego hacemos un ciclo de demostración para contar del 1 al 10 y mostrar los valores a medida que se procesan. El segundo bucle rellenará el búfer de los navegadores. Y finalmente, para verificar si todo está funcionando bien, dormimos durante 1 segundo. De lo contrario, el script se ejecutará demasiado rápido y no podríamos saber si logramos el objetivo. Espero que esto ayude!
Utilice flush
para enviar inmediatamente la salida al navegador, enjuagando el búfer de salida.
echo "foo";
flush();
echo "bar";
flush();
No se garantiza que la descarga funcione en todos los navegadores/plataformas/configuraciones – mrbinky3000
Puede crear una tabla de etapas.
El script PHP podría, en lugar de repetir el mensaje, almacenarlo en una tabla de base de datos (posiblemente tabla de memoria para el rendimiento).
Podrías periódicamente sondear un script PHP separado usando ajax, que consultaría la tabla, y devolvería cualquier mensaje nuevo al cliente.
De acuerdo. La descarga no funcionará el 100% del tiempo. Ajax es necesario. – mrbinky3000
¿No hay una solución tipo push (en lugar de sondeo)? – Richard
Básicamente, haga que el script escriba la salida HTML en un archivo de registro temporal. Luego use ajax para actualizar periódicamente el navegador del usuario final con el archivo de registro temporal. jQuery hará un trabajo rápido de esto.
Ajax es la única manera garantizada de que funcione en todos los navegadores. Aquí hay una cita de la página flush de PHP.
flush() puede no ser capaz de anular el esquema de amortiguación de su servidor web y no tiene efecto en ninguna de amortiguación del lado del cliente en el navegador. Tampoco afecta el espacio de usuario de PHP mecanismo de memoria de salida. Esto significa que tendrá que llamar tanto a ob_flush() y flush() para enjuagar los buffers de salida ob si los está usando.
¿Qué pasa si hay 1000 usuarios accediendo a la página al mismo tiempo con diferentes parámetros? , necesitarás escribir 1000 archivos, no veo esto como una opción. –
Puede crear fácilmente archivos temporales en PHP. Es básicamente lo mismo que 1000 usuarios INSERTAR cosas en una base de datos mysql. Diablos, uso, mysql. Simplemente almacene un registro en algún lugar y átelo a esa sesión si lo usa más de una persona. Tengo la sensación de que este es un script de back-end para ser utilizado por una sola persona. – mrbinky3000
Tiene la sensación correcta. Voy a ser el único usuario. – pHelics
Suena como si tuviera output buffering encendido.
Llamando ob_end_flush() imprimirá lo que está actualmente en el búfer, y apague el búfer para el resto de la ejecución del script.
En realidad lo que buscas es algo así como flush y ob_flush, sin embargo, tenga en cuenta que hay una gran cantidad de factores que pueden impedir su salida de ser flush'd como sucede.
De la documentación flush se obtendrá:
varios servidores, especialmente en Win32, seguirá siendo amortiguar la salida de la secuencia de comandos hasta que termina antes de transmitir los resultados al navegador.
Los módulos de servidor para Apache como mod_gzip pueden hacer un búfer propio que hará que flush() no provoque que los datos se envíen inmediatamente al cliente.
Hiciste un buen punto, hasta que el script esté listo, estoy trabajando en él en la plataforma Win32, luego lo pondré en Unix – pHelics
Puede usar la función flush() para enviar todo el contenido del búfer al cliente. http://php.net/manual/fr/function.flush.php
usted podría utilizar tanto flush
y ob_flush
, recordando a establecer el encabezado de tipo de contenido:
<?php
header('Content-type: text/html; charset=utf-8');
for($i = 0 ; $i < 10 ; $i++){
echo $i . '<br>';
flush();
ob_flush();
sleep(1);
}
Fuente: dermeister nota en php.net ob_flush página.
probado en Firefox y Chrome 42,0 46,0
estoy usando el @ob_flush()
después de cada echo
. En este ejemplo PHP_EOL
crea una nueva línea después $string
function output($string){
echo $string.PHP_EOL;
@ob_flush();
}
- 1. Barra de carga mientras se ejecuta el script
- 2. ejecuta php script automáticamente
- 3. Muestra los resultados mientras el script aún está ejecutándose
- 4. ¿Cómo se ejecuta exactamente un script PHP?
- 5. RMagick advertencia mientras se ejecuta el servidor
- 6. script de línea de comandos php no se ejecuta
- 7. Entrada manual desde el usuario mientras se ejecuta el script IDE de selenio
- 8. Cómo hacer que el script php ejecute otro script php
- 9. Error al informar mientras se ejecuta bajo IIS
- 10. hadoop java.io.IOException: mientras se ejecuta namenode -format
- 11. Bloquear una fila de lecturas mientras se ejecuta sp
- 12. Desactivar el modo inactivo mientras se ejecuta la aplicación iOS
- 13. Cómo saber dónde está el error mientras se ejecuta ctest
- 14. Editar script de shell mientras se está ejecutando
- 15. WakeLock finalizado mientras aún estaba ocupado
- 16. $ _SERVER ['DOCUMENT_ROOT'] no funciona en el script php que se ejecuta en cron
- 17. Eco equivalente en PowerShell para pruebas de script
- 18. Cambio del mensaje de diálogo de progreso mientras se ejecuta
- 19. Suprimir la salida de un comando ejecutado usando el método 'system' mientras se ejecuta en un script de ruby
- 20. ¿La fuente de C# se ejecuta como un script?
- 21. PHP: Cómo establecer el directorio de trabajo actual para que sea el mismo que el directorio que ejecuta el script
- 22. Menú de Android, lanzando IndexOutOfBoundsException mientras se ejecuta enPrepareOptionsMenu
- 23. Número entero de eco en la misma línea de salida mientras se incrementa?
- 24. emacs opciones de menú mientras se ejecuta en la terminal
- 25. Definición de una clase mientras se ejecuta una aplicación Java
- 26. script de shell que no se ejecuta mediante crontab, se ejecuta correctamente manualmente
- 27. Mostrando progreso mientras se ejecuta un comando de sistema() en Perl
- 28. No se puede ejecutar el script PHP usando PHP exec
- 29. Cómo hacer eco de JSON en PHP
- 30. ¿aún se recomienda el SICP?
similares a [esta cuestión] (http://stackoverflow.com/questions/4481235/php-flush-ob-flush-not-working). – netcoder
Otro caso simple sería ejecutar el script desde la línea de comandos, de esa manera obtendrá sus ecos en tiempo real. –