Retrasar ejecución con función sleep() en php

El siguiente código no hace lo que en principio quiero, o sea, un intérvalo de 3 segundos en cada escritura:
    $i=0;
    while ($i<3){
        echo "hola: " . $i . "<br>";
        sleep(3);
        $i++;
    }
Hace una espera de 3 segundos al inicio pero luego escribe seguido y sin interrupciones los tres números.
¿Cómo hago para que se interrumpa 3 segundos entre cada escritura?

Respuesta
1

He encontrado una solución, una basada en pruebas que he ido haciendo, resumiendo y poniendo código simple sería:

<script language='javascript' type='text/javascript'>
            function visualizar(pi){
                alert("visualizar: " + pi);
                pi=pi+1;
                setTimeout('visualizar(' + pi + ');',2000);
                return;
            }
            setTimeout('visualizar(0);',2000);
</script>

Sin embargo esto, al menos a mi, no me había funcionado:

<script language='javascript' type='text/javascript'>
            function visualizar(pi){
                alert("visualizar: " + pi);
                return;
            }
            for (var i=0;i<tabla.length;i++){
                setTimeout('visualizar(' + i + ');',2000);
            }
</script>

La cabecera de la pregunta hace referencia a la función sleep() de php, no he conseguido que sleep, pare dentro de un bucle, pero lo he adaptado de la siguiente manera:

1-Llamas a la bbdd y retornas todos los registros que deseas.

2- Introduces los valores retornados en un array javascript.

3- Mediante una función parecida a la de la solución, realizas las acciones que desees, haciendo una llamada inicial desde fuera de la función de javascript.

En mi caso, pasa dichos valores a otras ventanas y realiza llenados de pantalla, para posteriormente realizar otras tareas (es algo complejo) y lo realiza, puede que en algún caso parezca que no, porque no lo visualiza, pero se soluciona refrescando dicha ventana, si la consulta mysql retorna 20 registros, son 20 ventanas las que abre, alguna se puede quedar "pillada" pero funciona, refrescas, y punto.

Espero que sirva de algo a alguien y gracias a todos los colaborar con vuestras ideas en el asunto.

2 respuestas más de otros expertos

Respuesta

Prueba dejando por fuera a la función sleep

$i=0;

sleep(3);
    while ($i<3){
        echo "hola: " . $i . "<br>";
        $i++;
    }

Respuesta

Si lo que quieres es que cada 3 segundos aparezca un mensaje en pantalla creo que tendrás que recurrir a otros lenguajes de programación, que utilizan scripts dinamicos ejecutados desde el cliente y no desde el servidor. Este sería el caso de JavaScript, y lo que puedes hacer es que cada 3 segundos se borre lo que hay en la pantalla y se escriba nuevamente un mensaje.

SiREZ

Usa:

window.setTimeout

Llama a una función o ejecuta un fragmento de código después del retraso especificado.

La sintaxis es:

var timeoutID = window.setTimeout(func, retraso, [param1, param2, ...]);
var timeoutID = window.setTimeout(código, retraso);

donde

  • TimeoutID es el ID numérico del timeout, que puede usarse después con window. ClearTimeout().
  • Func es la funcion que usted quiere ejecutar después de los milisegundos de retraso.
  • Código en la sintaxis alternativa es una cadena de código que usted quiere ejecutar después de los milisegundos de retraso (el uso de esta sintaxis no está recomendado por las mismas razones de su uso en eval() )
  • retraso es el número de milisegundos (milésimas de segundo) que la función debe esperar para ser ejecutada. El retraso actual puede ser más largo.

Tenga en cuenta que pasando parámetros adicionales a la función en la primera sintaxis no funciona en Internet Explorer < 9. Si usted quiere habilitar esta funcionalidad en ese navegador, usted debe usar un código de compatibilidad.

Hola Sirez.

La solución que me aportas la llevo aplicando desde hace tiempo,  pero en el caso que pongo es para que se me entendiera lo que quiero, algo similar, realmente es muy resumido, lo que hace el código realmente, es leer una bbdd, y es en cada registro leido cuando tiene que hacer una parada, ya que dependiendo de lo que lee en la bbdd ha de llenar la pantalla con información en diferentes ventanas, es por ello que necesito que se "interrumpa" la ejecución en servidor, para dar tiempo a que se llene la pantalla  con información ... De hecho he realizado como 3 o 4 versiones de dicha funcionalidad y no termina de funcionar del todo bien ... el viernes mientras esperaba respuesta monté otra versión y el lunes la probaré, evidentemente está basada en el setTimeout. Han habido momentos, en versiones anteriores,  que utilizaba el sleep de php y el setTimeout de javascript de manera "conjunta"... ¿el resultado?, pues digamos que "ambiguo", digamos que lo ideal sería que sleep funcionara como digo, que lo hace, pero solo una vez y eso no es suficiente.

Gracias.

El sleep() así como lo quieres NO funciona con php porque del lado del servidor se ejecuta y cuando termina se lo entrega al usuario.

Con PHP lo puedes hacer redireccionando la página:

echo "<meta http-equiv='refresh' content='3;url=muestra datos.php' />";
//    pagina.php es la pagina que te muestra el resultados
// Content=' es el tiempo 3 segundos 

osea: Puedes probarlo de la siguiente manera: haces la consulta, redireccionas a la página donde vas a mostrar los datos

echo "<meta http-equiv='refresh' content='0;url=muestra datos.php' />";
//    muestra datos.php es la pagina que te muestra el resultados
// Content=' te lleva de una, 0 segundos 

imprimes los datos, luego a los 3 segundos redireccionas la página de consulta.

echo "<meta http-equiv='refresh' content='3;url=consulta.php' />";

 Bueno, algo parecido es lo que he hecho:

Meto en una matriz php todos los registros que quiero.

Luego mediante javascript incorporo dichos datos a un array javascript.

Recorro el array generado y mediante retrasos con setTimeout llamo a un nuevo fichero php, que es el que se encarga de leer los valores y generar lo que quiero ...

Esto funciona a veces y otras no, es por lo que queria hacerlo con el sleep, ya que si funcionara como debiera estoy seguro que conseguiría una mayor fiabilidad.

Prueba así:

Haces la primera consulta, creas el array o te llevas el id (variable de session) a la página que te muestra los datos

Allí incrementas el id, imprimes los datos y regresar después de XX segundos a la consulta:

echo "<meta http-equiv='refresh' content='XX;url=leer los datos.php' />";
// XX es el tiempo en segundos

y así sucesivamente hasta recorrer tu base de datos, o el usuario lo interrumpa.

¿Me supe explicar?

Trataré de probar tu alternativa. La mía no funciona, cosa que me "altera", ya que es javascript y debería funcionar, siempre "debería", siempre:

        <script language='javascript' type='text/javascript'>
            function visualizar(pi){
                alert("visualizar: " + tabla[pi].valor);
                return;
            }
            for (var i=0;i<tabla.length;i++){
                setTimeout('visualizar(' + i + ');',10000);
            }
        </script>

No hace falta que explique el código ¿no?, cada diez segundos debería mostrar en pantalla, un valor de la tabla, los muestra, pero inmediatamente después de pulsar una tecla, o sea, no espera los 10 segundos ...  y debería funcionar.

Hola, sirez, acabo de volver a leer  tu , respuesta, eso ya lo realicé en su momento, en vez de retornar todos los registros, lo que hacía era retornar solo uno (aplicando "top 1" en la sql), al terminar la tarea, modificaba un campo en la bbdd indicando que ya estaba "usada", por lo que al volver a la consulta y retornar de nuevo el "top 1" ya no encontraba la anterior, ... pero no terminaba de funcionar del todo bien ... se embuclaba, o al compaginar ambos lenguajes (php y javascript) no terminaba de funcionar, de ahí mi consulta inicial, la de utilizar sleep ... y así volvemos al principio de todo.

¿Por qué no utilizas solamente PHP?

Te funciona, ya lo he hecho.

SiREZ

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas