2009-04-11 11 views
40

Ho due domande riguardanti la funzione sleep() in PHP:Il conteggio del tempo di sospensione è previsto per il tempo limite di esecuzione?

  1. viene il tempo del sonno influenzano il limite di tempo massimo di esecuzione dei miei script PHP? A volte, PHP mostra il messaggio "tempo di esecuzione massimo di 30 secondi superato". Questo messaggio verrà visualizzato se utilizzo sleep(31)?

  2. Ci sono rischi nell'utilizzo della funzione sleep()? È costato un sacco di prestazioni della CPU?

+0

la mia ipotesi è che fa cound ... e perché avresti bisogno di un sleep() nel tuo PHP? mi stavo solo chiedendo ... per favore dì di più –

+0

La causa: posso eseguire cronjobs solo ogni 5 minuti. Quindi ho pensato di poter usare ... $ waittime = mt_rand (0, 290); sleep ($ waittime); ... ed esegui il codice 4 volte contemporaneamente. Quindi dovrei avere un cron in 4 punti diversi nel tempo. – caw

+0

Inizio alcuni script con tempi di sospensione superiori a 100 secondi. Ora il mio sito non viene più caricato. Probabilmente il server può eseguire solo x script contemporaneamente e ci sono x script che dormono. Potrebbe essere vero? – caw

risposta

77

Si dovrebbe provare, basta avere uno script che dorme per oltre il tempo massimo di esecuzione.

<?php 
    sleep(ini_get('max_execution_time') + 10); 
?> 

Spoiler: Under Linux, sleeping time is ignored, but under Windows, it counts as execution time.

+2

In realtà puoi accettare la sua risposta e creare un servizio per la comunità. –

+0

Mi piace vedere risposte estremamente semplici che fanno un lavoro migliore nell'illustrare di un paragrafo gigante. Adoro lo spoiler! –

+0

Penso che questa risposta sia un buon esempio del perché non si dovrebbe semplicemente provare un frammento di codice, ma piuttosto chiedere. – Adam

-5

a) Sì, conta verso il limite di tempo (in modo da dormire (31) attiveranno un errore)

b) Si fa il contrario di costare prestazioni della CPU - consente ad altre applicazioni di utilizzare la CPU (quando un'applicazione dorme, l'utilizzo della CPU di tale applicazione sarà vicino allo 0%). Oltre a prendere tempo lontano dall'utente, non posso davvero pensare ad alcun rischio di usare questo.

8

Influisce solo sul tempo di script e non sulle chiamate di sistema come sleep(). Apparentemente c'è un bug in cui è incluso Windows sleep(). Il tempo di esecuzione massimo riguarda il tempo reale, non il tempo della CPU o qualcosa del genere. Puoi comunque modificarlo:

  • max_execution_time direttiva nel tuo php.ini. Questa è un'impostazione globale;
  • Utilizzo di ini_set() con la direttiva precedente. Questo lo cambierà solo per lo script attualmente in esecuzione solo per quella esecuzione;
  • set_time_limit(): anche un cambio locale.

Per quanto riguarda la differenza tra gli ultimi due, credo che max_execution_time sia una quantità fissa. In esecuzione:

ini_set('max_execution_time', 60); 

limiterà lo script a 60 secondi. Se dopo 20 secondi chiami:

lo script ora sarà limitato a 20 + 60 = 80 secondi.

+1

?? Ci sono 6 risposte che dicono approssimativamente la stessa cosa e la mia viene downvoted? Come funziona? Cosa c'è di sbagliato in quanto sopra? – cletus

+0

Probabilmente perché hai cambiato la risposta per essere corretta dopo il downvote. – Samuel

+3

Non c'è un orario modificato in fondo, come potrebbe averlo cambiato? – Calvin

6

Dal PHP sleep() page, c'è questa nota contributo degli utenti:

Nota: La funzione set_time_limit() e la configurazione di max_execution_time direttiva riguardano solo il tempo esecuzione dello script stesso. Il tempo utilizzato per attività che accade fuori l'esecuzione dello script come chiamate di sistema utilizzando sistema(), la funzione sleep(), query di database, ecc non è incluso quando si determina il tempo massimo che il lo script è in esecuzione.

+1

Solo per aggiungere, questo comportamento è mostrato solo su * nix. Su windows set_time_limit() vince ogni volta. –

0

Altri hanno già coperto le basi del sonno() e script PHP limite di tempo di esecuzione, ma si dovrebbe anche essere consapevoli di un altro rischio quando si utilizza periodi di sonno veramente lunghi.

In genere, quando un browser invia una richiesta a un server e non riceve alcun dato dal server, la connessione può scadere. Questo limite di tempo dipende dalle configurazioni del browser, ma ho letto che IE7 ha un valore predefinito di soli 30 secondi, mentre Firefox has a default value of 115 seconds - puoi controllare la tua configurazione in Firefox andando a riguardo a: config e filtro per la rete .http.keep-alive.timeout (il limite di tempo è specificato in secondi).

Modifica: ho avuto le unità per network.http.keep-alive.timeout e browser.urlbar.search.timeout confusi. È davvero in pochi secondi, non un decimo di secondo.

+0

Grazie, non lo sapevo prima. Penso che il limite debba essere specificato in 1/1 ° di secondo perché il valore in about: config è 30.;) – caw

+0

Ah, hai ragione. È in pochi secondi. Ma il valore predefinito dovrebbe essere 300 secondi, non 30, quindi forse le tue impostazioni sono state modificate da un'estensione del browser. – Calvin