2009-11-12 18 views
12

Tengo un servidor dedicado que ejecuta Cent OS con un panel PLESK paralelo. Necesito ejecutar un script PHP cada segundo para actualizar mi base de datos. No es una forma alternativa de ahorrar tiempo, necesita actualizarse cada segundo.Ejecutar un script PHP cada segundo usando CLI

Puedo encontrar mi script usando la URL http://www.somesite.com/phpfile.php?key=123.

¿Se puede ejecutar el archivo localmente cada segundo? Me gusta phpfile.php?

Actualización:

Ha sido un par de meses desde que he añadido a esta pregunta. Terminé usando el siguiente código:

#!/user/bin/php 
<?php 
$start = microtime(true); 
set_time_limit(60); 
for ($i = 0; $i < 59; ++$i) { 
    doMyThings(); 
    time_sleep_until($start + $i + 1); 
} 
?> 

Mi cronjob se establece en cada minuto. He estado ejecutando esto por un tiempo en un entorno de prueba, y ha funcionado muy bien. Es realmente súper rápido y no veo un aumento en el uso de la CPU ni de la memoria.

+0

Supongo que seré yo quien pregunte: ¿qué haces que se necesita hacer cada segundo? Parece que pondrás una tensión increíble en el servidor MySQL. – dragonmantank

+1

Hola, voy a ejecutar un sitio web de subastas. En este sitio web puede realizar pujas automáticas, estas deben realizarse antes de que termine el tiempo. Con las ofertas que las personas colocan, el tiempo de finalización se prolonga durante un tiempo, por lo que las subastas no tienen que finalizar a una hora específica. –

+2

@Saif, la edición de su pregunta para deshacer las correcciones ortográficas no es muy útil ... – nickf

Respuesta

27

Usted podría hacerlo en PHP. Escriba un programa que se ejecutará durante 59 segundos, haciendo sus controles cada segundo, y luego termina. Combine esto con un trabajo cron que ejecuta que procesa cada minuto y listo.

Uno de los enfoques es la siguiente:

set_time_limit(60); 
for ($i = 0; $i < 59; ++$i) { 
    doMyThings(); 
    sleep(1); 
} 

La única cosa que probablemente tendría que tener en cuenta es el tiempo de ejecución de sus funciones doMyThings(). Incluso si eso es una fracción de segundo, entonces más de 60 iteraciones, que podrían sumarse para causar algunos problemas. Si está ejecutando PHP> = 5.1 (o> = 5.3 en Windows), entonces usted podría utilizar time_sleep_until()

$start = microtime(true); 
set_time_limit(60); 
for ($i = 0; $i < 59; ++$i) { 
    doMyThings(); 
    time_sleep_until($start + $i + 1); 
} 
+0

HI, gracias por la respuesta rápida. Estaba pensando en lo mismo, pero ¿este método no usa más potencia de CPU y uso de memoria? Y no sé cómo cambiar la configuración predeterminada de php para mi dominio. Supongo que tiene un tiempo limitado de ejecución. –

+1

'set_time_limit' cambiará el tiempo de ejecución, y generalmente no está bloqueado por los hosts en mi experiencia. – nickf

+1

¿Puede ayudarme a configurar este Cronjob cada minuto? ¿Hago esto en PLESK o en otro lugar? –

2

¿Por qué no ejecutar un cron para hacer esto y en el bucle de archivo php 60 veces que un breve descanso. Esa es la forma en que he superado esto para ejecutar un script php 5 veces por minuto.

Para configurar el archivo a ser ejecutado como un script añadir la ruta a la que su PHP en la primera línea, como un script en perl

#!/user/bin/php 
<?php 
    while($i < 60) { 
     sleep(1); 
     //do stuff 
     $i++; 
    } 
?> 
+0

¿Este método no consume más potencia de la CPU o más memoria –

+0

¿Qué quiere decir con ejecutar el archivo como un script? –

+0

No, dormir utilizará casi con seguridad menos CPU que volver a cargar el intérprete PHP cada segundo. –

1

me di cuenta que el PO editado la respuesta a dar su solución. Esta solución no funcionó en mi caja (la ruta de acceso a PHP es incorrecta y la sintaxis de PHP no es correcto)

Esta versión trabajó (guardar como whatever.sh y chmod + x whatever.sh para que pueda ejecutar)

#!/usr/bin/php 
<?php 
$start = microtime(true); 
set_time_limit(60); 
for ($i = 0; $i < 59; ++$i) { 
    echo $i; 
    time_sleep_until($start + $i + 1); 
} 
?> 
19

¿Has pensado en usar "ver"?

watch -n 1 /path/to/phpfile.php 

Simplemente inícielo una vez y seguirá funcionando. De esta forma, es inmune al bloqueo de PHP (no es que suceda, pero nunca se sabe). Incluso puede agregar este inittab para hacerlo completamente a prueba de balas.

+1

De hecho, me gusta esta solución más que una aceptada y las otras comparten la misma idea. – Nemoden

+0

Hola, Milán, he intentado buscar en Google cómo ver -n 1 pero no aparece ningún resultado. Me encantaría que pudieras dar algunos consejos. Gracias – njoshsn

+1

¿Tienes más información sobre este comando? ¿Dónde lo emites? – Notflip

2

Esta es la versión actualizada simple de nickf segunda solución que permite especificar el intervalo deseado en segundos entre cada ejecución en tiempo de ejecución.

$duration = 60; // Duration of the loop in seconds 
$sleep = 5; // Sleep beetween each execution (with stuff execution) 

for ($i = 0; $i < floor($duration/$sleep); ++$i) { 
    $start = microtime(true); 

    // Do you stuff here 

    time_sleep_until($start + $sleep); 
} 
Cuestiones relacionadas