Ejecute un script PHP cada segundo usando CLI

6 minutos de lectura

Ejecute un script PHP cada segundo usando CLI
Saif Bechan

Tengo un servidor dedicado que ejecuta Cent OS con un panel Parallel PLESK. Necesito ejecutar un script PHP cada segundo para actualizar mi base de datos. Esta no es una forma alternativa en cuanto al tiempo, debe actualizarse cada segundo.

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?

Actualizar:

Han pasado algunos meses desde que agregué 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 está configurado para cada minuto. He estado ejecutando esto durante algún 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.

  • Supongo que seré yo quien pregunte: ¿qué estás haciendo que necesita hacerse cada segundo? Parece que estará ejerciendo una presión increíble sobre el servidor MySQL.

    – dragonmantanque

    13 de noviembre de 2009 a las 0:35

  • Hola, voy a ejecutar un sitio web de subastas. En este sitio web puede realizar ofertas automáticas, estas deben realizarse antes de que finalice el tiempo. Con las pujas que la gente hace, el tiempo de finalización se prolonga durante un tiempo, por lo que las subastas no tienen que finalizar en un momento específico.

    – Saif Bechan

    13 de noviembre de 2009 a las 17:23

  • @Saif, editar su pregunta para deshacer las correcciones ortográficas no es muy útil…

    – nickf

    16 de noviembre de 2009 a las 5:47

Ejecute un script PHP cada segundo usando CLI
apodo

De hecho, podrías hacerlo en PHP. Escriba un programa que se ejecute durante 59 segundos, haga sus comprobaciones cada segundo y luego finalice. Combine esto con un trabajo cron que se ejecuta ese proceso cada minuto y listo.

Un enfoque es este:

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

Lo único que probablemente deba tener en cuenta es el tiempo de ejecución de su doMyThings() funciones Incluso si eso es una fracción de segundo, entonces más de 60 iteraciones, eso podría sumarse y causar algunos problemas. Si está ejecutando PHP> = 5.1 (o> = 5.3 en Windows), entonces podría usar time_sleep_until()

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

  • Hola, gracias por la rápida respuesta. 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 de ejecución limitado.

    – Saif Bechan

    12 nov. 09 a las 23:30

  • set_time_limit cambiará el tiempo de ejecución y, según mi experiencia, generalmente no está bloqueado por los hosts.

    – nickf

    12 de noviembre de 2009 a las 23:35

  • ¿Me pueden ayudar a configurar este Cronjob cada minuto? ¿Hago esto en PLESK o en algún otro lugar?

    – Saif Bechan

    12 de noviembre de 2009 a las 23:44

  • webhostingresourcekit.com/flash/plesk-8-linux/…

    – nickf

    13 de noviembre de 2009 a las 5:22

  • Esta respuesta es muy útil, especialmente la segunda parte. Para aquellos que se preguntan por qué alguien quiere ejecutar un cron con tanta frecuencia; considere mi situación, necesito sondear los datos del mercado comercial cada 2 segundos a través de una API. La segunda mitad de esta respuesta es especialmente útil, ya que a veces el script php que realiza la solicitud de API se ejecutará durante 2 segundos si el servidor remoto está ocupado.

    –Tim Hallman

    15 ene.

¿Has pensado en usar “reloj”?

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

Simplemente inícielo una vez y seguirá funcionando. De esta manera, 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.

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

    – Nemoden

    01 jun.


  • Hola Milan, he intentado buscar en Google cómo usar el reloj -n 1 pero no aparece ningún resultado. Me encantaría si pudiera dar algunos consejos Gracias

    – Stephen Ngethe

    11 jun.


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

    – Miguel Stevens

    24 feb. 16 a las 18:23

  • este enlace podría ayudar – tuxtweaks.com/2013/12/linux-watch-comando

    – neófito

    26 dic. 17 a las 16:25

Ejecute un script PHP cada segundo usando CLI
jW.

¿Por qué no ejecutar un cron para hacer esto y en el bucle del archivo php 60 veces, lo que significa un breve sueño? Esa es la forma en que superé esto para ejecutar un script php 5 veces por minuto.

Para configurar su archivo para que se ejecute como un script, agregue la ruta a su PHP en la primera línea, como un script perl

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

  • ¿Este método no consume más potencia de CPU o uso de memoria?

    – Saif Bechan

    12 de noviembre de 2009 a las 23:35

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

    – Saif Bechan

    12 de noviembre de 2009 a las 23:48

  • No, es casi seguro que dormir use menos CPU que recargar el intérprete de PHP cada segundo.

    – JW.

    16 de noviembre de 2009 a las 5:49

  • Tenga en cuenta que esto puede sumar más de 60 segundos, ya que su secuencia de comandos también llevará algo de tiempo. Esto haría que el siguiente trabajo cron se superpusiera con la ejecución anterior.

    – Fuego

    07 feb. 20 18:46

Esta es una versión mejorada simple de nickf segunda solución que permite especificar el intervalo deseado en segundos entre cada ejecución en el 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);
}

Ejecute un script PHP cada segundo usando CLI
degenerar

Noté que el OP editó la respuesta para dar su solución. Esta solución no funcionó en mi caja (la ruta a PHP es incorrecta y la sintaxis de PHP no es correcta)

Esta versión funcionó (guardar como lo que sea.sh y chmod +X lo que sea.sh para que pueda ejecutarse)

#!/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);
}
?>

Puede ejecutar su secuencia de comandos de bucle infinito con nohup Comando en su servidor que puede funcionar incluso si cierra sesión en el sistema. Solo reiniciar o apagar físicamente puede destruir este proceso. No olvides agregar sleep (1) en su script php.

nohup php /path/to/you/script.php

Ahora, en caso de que no necesite usar la consola mientras está funcionando, escribirá su salida en nohup.out archivo en su directorio de trabajo (utilice el pwd comando para obtenerlo).

.

¿Ha sido útil esta solución?