2010-08-08 48 views
20

La pregunta tipo de lo dice todo - no es una función que hace lo mismo que el JavaScript función setTimeout() para PHP? He buscado php.net, y parece que no puedo encontrar ninguna ...¿Existe una función similar a setTimeout() (JavaScript) para PHP?

+0

@KennyTM - ¿Por qué es importante ...? – Alexander

+1

@TheLife para que las personas puedan encontrar una solución real para el problema del OP. :) –

Respuesta

8

No hay forma de retrasar la ejecución de parte del código de en el script actual. Tampoco tendría mucho sentido, ya que el procesamiento de un script PHP tiene lugar completamente en el lado del servidor y usted simplemente retrasaría la ejecución general del script. Hay sleep() pero eso simplemente detendrá el proceso por un cierto tiempo.

Puede, por supuesto, programar un script PHP para que se ejecute en un momento específico utilizando trabajos cron y similares.

+0

Es un poco difícil de explicar, lo que quería es exactamente detener el guión :) Básicamente, lo que quiero hacer es "bromear" con uno de mis amigos. He hecho una entrada donde mecanografía tu nombre y cuando presentas una sala de chat se simula y para hacerlo más realista, quiero los mensajes del extraño, mi amigo está "hablando", para aparecer uno por uno si sabes lo que quiero decir :) – Latze

+6

Los eventos programados no tienen sentido porque la secuencia de comandos se ejecuta en el servidor? No estoy siguiendo la discusión. Ciertamente son menos útiles en PHP debido a la ausencia de simultaneidad, pero es útil tener un script que hace algo después de un período de tiempo específico o en un determinado momento. – Artefacto

+2

@Latze que suena como algo que te gustaría hacer usando JavaScript en el lado del cliente, ¿no? –

9

Existe la función sleep, que pausa la secuencia de comandos durante un tiempo determinado.

Véase también usleep, time_nanosleep y time_sleep_until.

+0

, sería bueno simular este tipo de código en php: http://hastebin.com/rujakezuco.lisp. el sueño está bloqueando, los tiempos muertos no lo están. – Dmitry

10

PHP no se basa en eventos, por lo que un setTimeout no tiene mucho sentido. Ciertamente puede imitarlo y, de hecho, alguien ha escrito un Timer class que podría usar. Pero tendría cuidado antes de comenzar a programar de esta manera en el lado del servidor en PHP.

+1

Pero php tiene las herramientas para hacer que su script específico sea controlado por eventos. por ejemplo, ejecutando php a través de la consola es posible que desee programar múltiples eventos en diferentes momentos, en este punto tiene sentido tener tiempos de espera excedidos. – Dmitry

2

A menos que esté utilizando AJAX para tener live solicitudes, PHP no sería el idioma preferido para este problema. Los scripts PHP no hacen hang y esperan otra respuesta. Ellos no son persistentes. Javascript sería requerido.

Incluso para una broma, una función javascript AJAX emparejada con un script PHP para analizar la entrada y responder en consecuencia sería exactamente lo que necesitaría. Incluso puede vincular esto con la función sleep en php para hacerlo más realista. Además, prepararía un montón de declaraciones diferentes para que el servidor las analizara, podría ir tan lejos como para establecer la cantidad de sleep tiempo requerido para cada declaración. Por ejemplo:

base de datos MySQL Ejemplo:

| ID | SLEEP | STATEMENT             | 
| 1 | 3 | Hello              | 
| 2 | 10 | I have been alright, nothing new.       | 
| 3 | 20 | This is a really long message that takes 20 seconds to type | 

por lo que podría analizar de la siguiente manera:

$query = mysql_query("SELECT * FROM `responses` WHERE `id`='3'"); 
$array = mysql_fetch_array($query); 
sleep((int)$array['sleep']); //convert sleep time to integer, sleep. 
die($array['statement']);  //print the statement back to AJAX function 
1

si necesita realizar una acción después de ejecutar código PHP que puede hacerlo con un eco

echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>"; 

así que después de un tiempo en el cliente (navegador) puede hacer otra cosa, como un redirigir a otra secuencia de comandos PHP, por ejemplo, o eco de una alerta

1

http://php.net/manual/en/class.evtimer.php es probablemente lo que está buscando, puede tener una función llamada durante intervalos establecidos, similar a setInterval en javascript. es una extensión pecl, si tiene whm/cpanel, puede instalarlo fácilmente a través de la página de instalación del software/extensión pecl.

No había notado que esta pregunta es de 2010 y la clase evtimer comenzó a codificarse en 2012-2013.así como una actualización de una pregunta anterior, ahora hay una clase que puede hacer esto similar a javascripts settimeout/setinterval.

6

Un par de cosas que me gustaría tener en cuenta sobre los temporizadores en PHP:

1) Timers en PHP tiene sentido cuando se utiliza en las secuencias de comandos de larga duración ( demonios y, tal vez, en secuencias de comandos de la CLI). Entonces, si no está desarrollando ese tipo de aplicación, entonces no necesita los temporizadores.

2) Los temporizadores pueden ser bloqueantes y no bloqueantes. Si está usando sleep(), entonces es un temporizador de bloqueo, porque su script simplemente se congela por una cantidad de tiempo específica. Para muchas tareas, bloquear temporizadores está bien. Por ejemplo, enviando estadísticas cada 10 segundos. Está bien para bloquear el guión:

while (true) { 
    sendStat(); 
    sleep(10); 
} 

3) contadores de tiempo de bloqueo no tiene sentido sólo en aplicaciones accionadas por eventos, como WebSocket-servidor. En dichas aplicaciones, un evento puede ocurrir en cualquier momento (por ejemplo, una conexión entrante), por lo que no debe bloquear su aplicación con sleep() (obviamente). Para este propósito, hay bibliotecas de bucles de eventos, como reactphp/event-loop, que le permite manejar varias transmisiones sin bloqueos y también tiene la función de temporizador/intervalo.

4) Tiempos de espera sin bloqueo en PHP son posibles. Se puede implementar mediante la función stream_select() con parámetro de tiempo de espera (ver cómo se implementa en reactphp/event-loop StreamSelectLoop::run()).

5) Hay extensiones PHP como libevent, libev, event que permiten la implementación temporizadores (si quieres ir hardcore)

Cuestiones relacionadas