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

Ho intenzione di creare un server web PHP, quindi questo script funzionerà per sempre con Curl?può fare uno script php da eseguire per sempre con Cron Job?

+1

quello che ti serve è 'while (true)', e sì continuerà a funzionare per sempre fino a quando succede qualcosa (preferibilmente a causa di una condizione di rottura specificata) – Adi

+0

@AdnanShammout terminerà automaticamente dopo qualche tempo. PHP ha un tempo massimo di esecuzione del set integrato, a meno che tu non modifichi questa impostazione nel tuo codice. –

+0

@DexterHuinda, il limite di esecuzione PHP si applica solo quando si esegue da un browser web. Quando si esegue come comando 'php server.php' il limite non si applica. Perché qualcuno dovrebbe voler eseguire un server per sempre da un browser web? – Adi

risposta

15

Non dimenticare di impostare il tempo di esecuzione massimo su infinito (0).

Meglio essere sicuri di non eseguire più di un caso, se è vostra intenzione:

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"); 

Se in modalità CLI, basta eseguire il file.

Se in un altro PHP su un server web, si potrebbe iniziare quello che deve eseguire infinetely come questo (invece di utilizzare cURL, questo eliminando una dipendenza):

$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); 

Oppure si potrebbe iniziare da linux cron usando wget come questo:

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

Oppure si potrebbe iniziare da Windows Scheduler utilizzando bitsadmin l'esecuzione di un file .bat, che contiene questo:

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

buona tecnica di chiusura con maniglie di file, pollice in su! –

+0

Upvotes up! ... –

+0

aggiunto ignore_user_abort per assicurarsi che lo script non termini perché il chiamante ha abbandonato la richiesta, quando si trova in un ambiente web. –

0

Per impostazione predefinita, no perché PHP ha un limite di tempo di esecuzione. Vedi: http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

È possibile farlo funzionare per sempre da una impostando il valore oppure chiama set_time_limit nello script (http://php.net/manual/en/function.set-time-limit.php).

Ma io non lo consiglio perché PHP (chiamato da richiesta HTTP) non è progettato per avere un ciclo infinito. Utilizzare invece uno script locale, se possibile, oppure richiedere la pagina a intervalli per eseguire frequentemente l'attività.

Se il tuo sito web viene visitato da altri frequentemente, puoi farlo in ogni pagina.

(E immaginate se qualcuno richiede lo script più di una volta, si avrà più istanze di esso in esecuzione)

+0

Questo si applica solo quando si esegue da un browser web – Adi

+0

@AdnanShammout Ha dichiarato 'arricciato 'in modo che la migliore ipotesi possa essere eseguita dalla richiesta HTTP –

+0

Potresti guidarmi attraverso tale processo di inferenza? Non vedo come 'arricciare 'indichi l'esecuzione da un browser web. – Adi

0

È possibile farlo accadere solo se si imposta set_time_limit (0) nello script, altrimenti interromperà l'esecuzione dopo max_execution_time impostato nella configurazione.

E si sta utilizzando la condizione (true), che renderà lo script sempre attivo.

1

Per un codice php per correre per sempre, si dovrebbe avere la ss .:

  • set_time_limit(0); // modo PHP non terminerà come di consueto, se si farà roba che avrà un tempo molto lungo di elaborazione tempo
  • gestore per mantenere la pagina attiva [di solito attraverso la creazione di uno script lato client per chiamare la stessa pagina in intervalli] Guarda setInterval(), setTimeout()

EDIT: Ma visto che sarà sett con un cron job, è possibile evitare la gestione lato client.

MODIFICA: Il mio suggerimento, non è quello di usare cicli infiniti a meno che non si abbia un codice che dice di uscire dal ciclo dopo un po 'di tempo. Ricorda che chiamerai la stessa pagina usando un cron job, quindi non ha senso mantenere il loop infinito. [modifica] Altrimenti, avrai bisogno di un sistema di blocco come suggerito da @ Tiberiu-Ionu Stan, quindi solo 1 istanza può essere eseguita ogni volta che viene chiamato il processo cron.

Problemi correlati