2012-06-21 18 views
5
<?php 
while(true){ 
//code goes here..... 
} 
    ?> 

Voy a hacer un servidor web PHP, ¿esta secuencia de comandos se ejecutará para siempre con Curl?puede hacer que un script php se ejecute para siempre con Cron Job?

+1

lo que necesita es 'while (true)', y sí, seguirá funcionando para siempre hasta que ocurra algo (preferiblemente debido a una condición de falla que usted especifique) – Adi

+0

@AdnanShammout terminará automáticamente después de algún tiempo. PHP tiene un tiempo de ejecución máximo establecido incorporado, a menos que modifiques esa configuración en tu código. –

+0

@DexterHuinda, el límite de ejecución de PHP solo se aplica cuando se ejecuta desde un navegador web. Cuando se ejecuta como un comando 'php server.php', el límite no se aplica. ¿Por qué alguien querría ejecutar un servidor para siempre desde un navegador web? – Adi

Respuesta

15

No olvide establecer el tiempo máximo de ejecución en infinito (0).

mejor asegurarse de que no se quede más de una instancia, si esa es su intención:

ignore_user_abort(true);//if caller closes the connection (if initiating with cURL from another PHP, this allows you to end the calling PHP script without ending this one) 
set_time_limit(0); 

$hLock=fopen(__FILE__.".lock", "w+"); 
if(!flock($hLock, LOCK_EX | LOCK_NB)) 
    die("Already running. Exiting..."); 

while(true) 
{ 

    //avoid CPU exhaustion, adjust as necessary 
    usleep(2000);//0.002 seconds 
} 

flock($hLock, LOCK_UN); 
fclose($hLock); 
unlink(__FILE__.".lock"); 

Si en el modo CLI, basta con ejecutar el archivo.

Si en otro PHP en un servidor web, usted podría comenzar el que se debe ejecutar infinetely como esto (en lugar de utilizar cURL, esto elimina una dependencia):

$cx=stream_context_create(
    array(
     "http"=>array(
      "timeout" => 1, //at least PHP 5.2.1 
      "ignore_errors" => true 
     ) 
    ) 
); 
@file_get_contents("http://localhost/infinite_loop.php", false, $cx); 

O usted podría comenzar desde cron Linux a través de wGET así:

`* * * * * wget -O - http://localhost/infinite_loop.php` 

O usted podría comenzar desde el Programador de Windows utilizando bitsadmin ejecutar un archivo .bat que contiene lo siguiente:

bitsadmin /create infiniteloop 
bitsadmin /addfile infiniteloop http://localhost/infinite_loop.php 
bitsadmin /resume infiniteloop 
+1

buena técnica de bloqueo usando manejadores de archivos, pulgares arriba! –

+0

¡Upvotes up! ... –

+0

se agregó ignore_user_abort para garantizar que el script no finalice porque la persona que llama abandonó la solicitud cuando estaba en un entorno web. –

0

De forma predeterminada, no porque PHP tiene un límite de tiempo de ejecución. Ver: http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

Usted puede hacer que se ejecute siempre, ya sea estableciendo el valor o llame set_time_limit en el script (http://php.net/manual/en/function.set-time-limit.php).

Pero no lo recomiendo porque PHP (llamado por solicitud HTTP) no está diseñado para tener un ciclo infinito. Use una secuencia de comandos local si puede, o solicite la página en intervalos para realizar la tarea con frecuencia.

Si su sitio web es visitado por otros con frecuencia, puede hacerlo en cada página.

(E imaginar si alguien pide al guión más de una vez, tendrá varias instancias de la misma corriente)

+0

Esto solo se aplica solo cuando se ejecuta desde un navegador web – Adi

+0

@AdnanShammout Dijo 'curl' así que la mejor suposición se ejecutará desde la solicitud HTTP –

+0

¿Podría guiarme a través de ese proceso de inferencia? No veo cómo 'curl' indicaría que se ejecuta desde un navegador web. – Adi

0

Puede que esto ocurra sólo si se establece set_time_limit (0) en el script, de lo contrario detiene la ejecución después de max_execution_time configurado en la configuración.

Y está utilizando la condición (verdadera), que hará que la secuencia de comandos se ejecute siempre.

1

Para un código php para correr para siempre, debe tener el ff .:

  • set_time_limit(0); // Así que PHP no terminará como normal, si usted va a hacer las cosas que tendrá un procesamiento muy largo
  • tiempo
  • controlador para mantener la página activa [por lo general mediante la creación de un script del lado del cliente para llamar a la misma página en intervalos] Ver setInterval(), setTimeout()

EDIT: Pero, ya que será de pavimiento En un trabajo cron, puede mantenerse alejado del manejo del lado del cliente.

EDIT: Mi sugerencia es no utilizar bucles infinitos a menos que tenga un código que le indique que salga del bucle después de un tiempo. Recuerde, llamará a la misma página utilizando un trabajo cron, por lo que no tiene sentido mantener el bucle infinito. [edit] De lo contrario, necesitarás un sistema de bloqueo según lo sugerido por @ Tiberiu-Ionuţ Stan, por lo que solo se puede ejecutar 1 instancia cada vez que se llame al trabajo cron.

Cuestiones relacionadas