2013-03-14 14 views
24

In PHP, voglio mettere un secondo ritardo su ogni iterazione del ciclo.Ritardo sleep PHP

for ($i=0; $i <= 10; $i++) { 
    $file_exists=file_exists($location.$filename); 
    if($file_exists) { 
     break; 
    } 

    //sleep for 3 seconds 
} 

Come posso fare questo?

+1

Solo curioso ... Perché vuoi ritardare il ciclo? – Baba

+2

Probabilmente dovrei sottolineare che un ciclo eseguito 10 volte con un ritardo di 3 secondi impiegherà 30 secondi per essere eseguito. Questo potrebbe far scadere il tuo server, quindi controlla le tue configurazioni e verifica se puoi eseguire qualche elaborazione al di fuori di PHP, ad esempio tramite cron o qualcosa del genere. – Husman

+3

@Husman: 11 volte, non 10 volte. ;) –

risposta

42

Utilizzare la funzione PHP sleep(). http://php.net/manual/en/function.sleep.php Arresta l'esecuzione del ciclo successivo per il numero di secondi specificato. Quindi, qualcosa di simile

for ($i=0; $i <= 10; $i++) { 
    $file_exists=file_exists($location.$filename); 
    if($file_exists) { 
     break; 
    } 
    sleep(3); // this should halt for 3 seconds for every loop 
} 
5

È possibile utilizzare sleep(3) che può ospitare il filo per 3 secondi.

Correzione metodo in php are in seconds.

+1

confondere sleep with usleep() – rinchik

+3

è 'sleep (3)', non sleep (3000). – Sliq

+2

'sleep sleep (3000)' dormirà per quasi un'ora! –

11

Vedo quello che stai facendo ... il tuo ritardare uno script per controllare costantemente un file sul filesystem (uno che viene caricato o che viene scritto da un altro script presumo). Questo è un modo CATTIVO per farlo.

  1. Lo script verrà eseguito lentamente. Soffocamento del server se diversi utenti eseguono tale script.
  2. Il server potrebbe scadere per alcuni utenti.
  3. L'accesso HDD è una risorsa costosa.
  4. Ci sono modi migliori per farlo.

È possibile utilizzare Ajax. E usa un timeout per chiamare lo script PHP ogni pochi secondi. Ciò eviterà il caricamento lento dello script. Inoltre, puoi continuare a farlo costantemente (il ciclo corrente per verrà eseguito solo per 33 secondi e quindi verrà interrotto).

È possibile utilizzare un database. In alcuni casi, l'accesso al database è più rapido dell'accesso all'HDD. Soprattutto con visualizzazioni e memorizzazione nella cache. Lo script che crea il file/carica il file può impostare un flag in una tabella (es. File_exists) e quindi puoi avere uno script che controlli quel campo nel tuo database.

+0

Sarebbe meglio non scrivere affatto una funzione di ritardo e metterla a correre più a lungo forse 20 volte? – Yeak

+1

@ Yevo No. Un ciclo di 20 volte verrà eseguito in meno di un secondo. Dipende davvero dalla velocità della CPU. Il ritardo verrà eseguito in tempo utente (secondi). – Husman

+0

Il fatto di dipendere da AJAX per qualcosa di simile è che è facilmente aggirabile. Tutto ciò che viene eseguito nel client non può essere invocato perché posso semplicemente spegnerlo o anche usare uno strumento come curl per inviare comandi http direttamente – GordonM

0

Avete considerato l'utilizzo di uno script Daemon PHP utilizzando supervisorD. Lo uso in più attività che devono essere eseguite continuamente.

Il problema è assicurarsi che ogni volta che si esegue lo script si controllino le risorse di memoria. Se è troppo alto, interrompi il processo e poi lascialo ricominciare da capo.

Ho utilizzato correttamente questo processo per controllare sempre i record del database per le attività da elaborare.

Potrebbe essere eccessivo ma vale la pena considerare.

0

Lepre sono due modi per dormire script php per un certo periodo di tempo. Quando hai il tuo codice e vuoi mettere in pausa lo script che funziona per un po 'di tempo usa queste funzioni. In questi esempi t la prima parte del codice verrà eseguita in esecuzione di script e la seconda parte del codice verrà eseguita ma con ritardo.

  1. Utilizzando la funzione sleep() è possibile definire il tempo di sospensione in secondi.

Esempio:

echo "Message 1"; 
// The first part of code. 
$timeInSeconds = 3; 
sleep($timeInSeconds); 
// The second part of code. 
echo "Message 2"; 

In questo modo è possibile dormire script php per 3 secondi. Usando questa funzione puoi dormire script per intero numero (intero) di secondi.

  1. Utilizzando la funzione usleep() è possibile definire il tempo di sospensione in microsecondi. Questo tempo di sonno è conveniente per intervalli che richiedono un tempo più preciso di un secondo.

Esempio:

echo "Message 1"; 
// The first part of code. 
$timeInMicroSeconds = 2487147; 
usleep($timeInMicroSeconds); 
// The second part of code. 
echo "Message 2"; 

È possibile utilizzare questa funzione se volete dormire php per i valori di tempo più brevi rispetto al secondo (float). In questo esempio ho messo lo script in stop per 2.487147 secondi.