time_nanosleep()
Scopri la funzione PHP time_nanosleep(): sintassi, parametri, valori restituiti ed esempi per creare ritardi con precisione al nanosecondo.
In questo articolo ci concentreremo sulla funzione PHP time_nanosleep(). Ne esamineremo la sintassi, i parametri e i valori restituiti, mostreremo esempi funzionanti, spiegheremo come gestire le interruzioni e indicheremo le funzioni correlate per i ritardi.
Introduzione alla funzione time_nanosleep()
La funzione time_nanosleep() è una funzione PHP integrata che mette in pausa l'esecuzione di uno script per un numero specificato di secondi e nanosecondi. Poiché accetta una precisione al nanosecondo, è il metodo più granulare per introdurre un ritardo in PHP — molto più preciso di sleep(), che accetta solo secondi interi.
Un nanosecondo è un miliardesimo di secondo (1e-9 s), quindi 1000000000 nanosecondi equivalgono a un secondo intero. In pratica, la precisione reale è limitata dallo scheduler del sistema operativo, ma la funzione consente di richiedere ritardi inferiori al microsecondo.
time_nanosleep() è basata su POSIX e non è disponibile su Windows per impostazione predefinita.
Sintassi
time_nanosleep(int $seconds, int $nanoseconds): array|boolParametri
$seconds— il numero di secondi interi di pausa. Deve essere un intero non negativo.$nanoseconds— il numero aggiuntivo di nanosecondi di pausa, nell'intervallo da0a999999999. Valori pari a1000000000o superiori causano un avviso e la chiamata fallisce.
Valori restituiti
- Restituisce
truein caso di successo. - Restituisce
falsein caso di errore (ad esempio, quando un argomento è fuori dall'intervallo consentito). - Se il riposo viene interrotto da un segnale, restituisce un array associativo con due chiavi,
secondsenanoseconds, contenenti il tempo rimanente di pausa. Questo consente di riprendere il ritardo dal punto in cui è stato interrotto.
Come utilizzare la funzione time_nanosleep()
Chiama la funzione passando il numero di secondi e nanosecondi di pausa. Ecco un esempio di base:
In questo esempio, chiamiamo time_nanosleep() con 1 secondo e 500000000 nanosecondi. Questo mette in pausa lo script per 1 secondo più 500.000.000 nanosecondi (0,5 secondi), quindi 1,5 secondi in totale. Stampiamo un messaggio prima della pausa, aspettiamo il tempo specificato, quindi stampiamo un altro messaggio al termine.
Misurare il ritardo effettivo
Poiché lo scheduler del sistema operativo decide esattamente quando il processo riprende, la pausa reale è almeno pari alla durata richiesta, ma potrebbe essere leggermente più lunga. Puoi verificarlo con microtime():
Il valore stampato sarà approssimativamente 0.250 secondi (ad esempio 0.250 o 0.251), confermando il ritardo di un quarto di secondo richiesto.
Riprendere dopo un'interruzione da segnale
Se un segnale interrompe il riposo, time_nanosleep() restituisce il tempo rimanente come array invece di true. Puoi eseguire un ciclo finché non è trascorso l'intero ritardo:
Senza un gestore di segnali il corpo del ciclo non viene mai eseguito, ma questo è il pattern corretto per gli script che registrano gestori di segnali tramite l'estensione pcntl.
Considerazioni sulle prestazioni
time_nanosleep() è efficiente perché si affida allo scheduler del sistema operativo anziché a un'attesa attiva, quindi non consuma cicli CPU durante la pausa. Tieni a mente questi punti:
- È solo POSIX e non disponibile su Windows per impostazione predefinita. Su Windows, usa
usleep()per ritardi al microsecondo. - Quando viene chiamata frequentemente, l'overhead del cambio di contesto può accumularsi, quindi usala solo quando è effettivamente richiesta una precisione inferiore al secondo.
- La pausa è un minimo, non una garanzia esatta — non fare mai affidamento su di essa per una temporizzazione in tempo reale rigida.
Funzioni correlate
sleep()— mette in pausa l'esecuzione per un numero intero di secondi.usleep()— mette in pausa l'esecuzione per un numero di microsecondi.time_sleep_until()— mette in pausa fino al raggiungimento di un determinato timestamp Unix.microtime()— ottiene l'ora corrente con precisione al microsecondo, utile per misurare i ritardi.
Conclusione
In conclusione, la funzione time_nanosleep() è uno strumento potente per creare ritardi con una temporizzazione molto precisa. Comprendendo come utilizzare la funzione e le relative considerazioni sulle prestazioni, puoi sfruttare questa caratteristica per creare ritardi temporali precisi nei tuoi script PHP.