2011-01-23 10 views
8

Estoy creando un sitio php, y me gustaría tener un script (cuando hace clic en un botón) que agrega información a mi base de datos mysql (puedo hacerlo parte por mí mismo) y ejecuta una secuencia de comandos 5 minutos más tarde. Tal vez no es difícil, pero es difícil googlear cosas como esta, gracias de antemano.PHP: ejecute el script 5 minutos después de ejecutar el primer script

+1

¿Cuál es el propósito de esta acción desplazada en el tiempo? ¿Qué información se agrega que requiere este desplazamiento? – Gumbo

+1

Estoy haciendo un juego basado en navegador y lo quiero si alguien quiere construir un edificio que demora * minutos y luego termina. – Nyohosud

+0

ese comentario ayuda mucho con nuestra comprensión de lo que está tratando de lograr y cómo ayudarlo. Sugeriría que muchas de las respuestas ya dadas están tratando de lograr algo bastante diferente. – Spudley

Respuesta

-3

¿Estás buscando eso?

sleep php.net

+0

'sleep' se bloqueará; El OP no lo mencionó explícitamente, pero suena más como una pregunta para una solución sin bloqueo. – miku

+0

No realmente, quiero que ejecute otro script. P.EJ. el botón llama a process.php y process.php tiene que ejecutar other.php 5 minutos después. – Nyohosud

+0

Un poco de imaginación ... Por supuesto que no puedes hacer eso en el mismo script de la página web. Pero puede llamar desde el scriptOfWebBrowser.php a otro script actionAfter5Minutes.php en el servidor que ejecuta el fondo con la función sleep, por lo que no necesita ningún cron o lo que sea y no es un problema para el usuario ... – raultm

6

El sueño es una muy mala idea. ¡El navegador del cliente debería esperar 5 minutos para finalizar la solicitud!

En mi opinión, no es posible hacerlo como desee.

Debería crear otra secuencia de comandos que consulte la base de datos y compruebe si hay datos nuevos (y en la recuperación exitosa hace el trabajo). Este script debe ser ejecutado por cron cada N minutos.

4

Puede implementar una cola en su base de datos, donde puede agregar "comandos" para ejecutar y también almacenar cuando ejecutar este comando. Luego, tenga un trabajo cron que se ejecute cada minuto y compruebe dicha cola para ver si es el momento de ejecutar un determinado comando.

5

Bastante difícil. me gustaría ir para algo como esto:

  1. su guión original agrega un registro a la base de datos, que contiene su momento de la ejecución,
  2. otro guión contiene la acción que necesita ser tomado 5 minutos más tarde - pero lo inicia solo si el registro db mencionado anteriormente contiene una marca de tiempo de al menos 5 minutos atrás (espero que sea lo suficientemente claro, tengo problemas para redactar esto)
  3. configure crontab para ejecutar el segundo script cada X minutos (quizás 2).

No serán 5 minutos EXACTAMENTE, sino más bien algo entre 5 y 7 (en caso de que elija iniciar el script cada 2 minutos). ¿Eso haría?

+0

Esto parece una buena idea , pero ¿cómo puedo calcular si el tiempo de 1 de las entradas fue hace 5 minutos? – Nyohosud

+0

En el primer script, pones 'executiontime = NOW()' en la base de datos. En el segundo, comprueba 'executiontime mingos

0

En mi humilde opinión la mejor manera es: botón Encendido haga clic en guardar el trabajo para ejecutarlo en el archivo db con el tiempo que debe ejecutarse. Escriba un daemon pequeño, recupera cada 10/5/2 segundos los trabajos nuevos que deben ejecutarse y los ejecuta.

EDITAR: Por cierto, es mejor utilizar cron para buscar nuevos trabajos, pero solo si tiene un sitio web pequeño y no necesita hacer un balanceo de carga para los trabajos.

0

La forma en que lo haría es ejecutar un trabajo cron entre los dos scripts.

  1. la primera secuencia de comandos establece un valor en una tabla de base de datos.
  2. el trabajo cron ejecuta el segundo script. cada minuto o lo que no.
  3. la segunda secuencia de comandos comprueba el valor de la base de datos establecido por la secuencia de comandos 1 para decidir si se ejecutará por completo o no.
0

Puede bifurcar el proceso y en la horquilla infantil, haga una pausa de 5 minutos antes de ejecutar su segundo script. He probado esto y parece que el proceso hijo se ejecutará incluso después de que el padre haya terminado.Algo así como

//initial code 
$pid = pcntl_fork(); //fork the process 
if ($pid==0) // if in the child 
{ 
    exec("sleep 300; php second_process.php"); //sleep for 5 minutes and execute second script 
    return; // or exit 
} 
// rest of initial script... 

El "retorno"; es importante ya que el resto del script se ejecutará por segunda vez (es decir, en el niño) a menos que esté allí.

0

Sugeriría hacer el temporizador en Javascript en lugar de PHP.

Ponga una marca de tiempo en $ _SESSION del usuario para indicar cuándo comenzaron el evento, y luego haga que Javascript vuelva a llamar al navegador después de cinco minutos.

PHP aún necesitaría saber la hora de inicio (para evitar que el usuario piratee el juego ajustando el tiempo de espera de Javascript), pero no necesitaría hacer ningún tiempo de cuenta regresiva o dormir ni nada parecido eso mismo.

3

Si estás en una máquina Unix:

exec("echo 'php script.php' | at now +5 minutes"); 

Qué va a programar el comando php script.php para funcionar después de 5 minutos.

+0

Esto se vuelve bastante difícil de manejar con muchos usuarios, sin embargo. – ceejayoz

1

Estoy haciendo un juego basado en navegador y lo quiero si alguien quiere construir un edificio que tarda * minutos y luego termina.

Teniendo en cuenta que este es su objetivo real, recomiendo simplemente guardar el edificio original con una marca de tiempo.

Sé que etiquetó su pregunta con PHP, pero no quiero incluir todos los gastos generales de manejo de consultas de mysql en PHP, especialmente porque no sé cómo prefiere ejecutar las consultas o qué marco de trabajo ' re demandar, así que aquí tiene algunos pseudocódigo para manejar esta tarea "edificio edificios":

build.php

building_type_id = sanitize(POST['id']) 
user_id = current_user['id'] 

query('INSERT INTO buildings (user_id, building_type_id, created_at) 
     VALUES (' + user_id + ', ' + building_type_id + ', CURRENT_TIME)'); 

my_buildings.php

user_id = current_user['id'] 

completed_buildings = query('SELECT * FROM buildings b 
    LEFT OUTER JOIN building_types t ON b.building_type_id = t.id 
    WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) < NOW();') 
under_construction = query('SELECT * FROM buildings b 
    LEFT OUTER JOIN building_types t ON b.building_type_id = t.id 
    WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) > NOW();') 

Espero que esto ayude!

+0

Este es un gran pedazo de código, ¡exactamente lo que estoy tratando de lograr! la próxima vez agregaré lo que quiero lograr en la primera publicación. ¡Gracias! – Nyohosud

+0

Si te gusta, no dude en contribuir con un voto y/o haga clic en la marca de verificación a la izquierda de esta respuesta para que otros en el futuro puedan encontrarlo más fácilmente. –

Cuestiones relacionadas