2010-09-07 11 views
15

Mi piacerebbe sapere perché, come e quando utilizzare le zecche in PHP:Cosa sono i tick usati in PHP?

declare(ticks=1); 

// A function called on each tick event 
function tick_handler() 
{ 
    echo "tick_handler() called\n"; 
} 

register_tick_function('tick_handler'); 

$a = 1; 

if ($a > 0) { 
    $a += 2; 
    print($a); 
} 
+0

possibile duplicato di [In PHP, cos'è un segno di spunta?] (Http://stackoverflow.com/questions/1629005/in-php-what-is-a-tick) –

risposta

3

Un tick è un evento che si verifica per ogni N istruzioni di basso livello eseguite dal parser all'interno del blocco declare. Il valore per N viene specificato utilizzando ticks=N all'interno della sezione direttiva dei blocchi di dichiarazione.

Gli eventi che si verificano su ogni spunta sono specificati utilizzando register_tick_function().

+1

Penso che @James Tang stia chiedendo per cosa è usata questa funzione. Penso che capisca cosa sono le zecche e cosa fanno. – strager

+1

@stranger, sono d'accordo, ma la parte "come" della domanda mi ha spinto a postare questa risposta. – shamittomar

+2

così com'è (ctrl + c) (ctrl + v) da [php.net] (http://www.php.net/manual/en/control-structures.declare.php#control-structures.declare.ticks) –

12

Un uso è stato delineato da [email protected]:

Come già notato Chris, zecche non rende lo script multi-threaded, ma sono ancora grandi. Io li uso principalmente per il profiling - per esempio, inserendo il seguente proprio all'inizio dello script consente di monitorare il suo utilizzo di memoria:

<?php 

function profiler($return=false) { 
    static $m=0; 
    if ($return) return "$m bytes"; 
    if (($mem=memory_get_usage())>$m) $m = $mem; 
} 

register_tick_function('profiler'); 
declare(ticks=1); 

/* 
Your code here 
*/ 

echo profiler(true); 

?>

Questo approccio è più preciso di chiamare memory_get_usage solo nel fine dello script . Ha un po 'di sovraccarico delle prestazioni però :)

Un altro utilizzo è stato descritto da [email protected]:

come ho letto su zecche la prima volta ho pensato "WTF, stronzate inutili" - ma poi ho scoperto qualche utile applicazione ...

è possibile dichiarare un segno di spunta-funzione la quale controlla ogni n esecuzioni dello script se la connessione è ancora vivo o no, molto utile per un qualche tipo di script per diminuire serverload

<?php 

function check_connection() 
{ if (connection_aborted()) 
    { // do something here, e.g. close database connections 
     // (or use a shutdown function for this 
     exit; } 
} 

register_tick_function("connection"); 

declare (ticks=20) 
{ 
    // put your PHP-Script here 
    // you may increase/decrease the number of ticks 
} 

?>
7

Le zecche possono essere utilizzati per le cose di base come:

  1. profilare i vostri script
  2. utilizzo della memoria Monitor
  3. tempo di esecuzione Conte
  4. Controllare le risorse, ad esempio, che una connessione al database è attiva

In PHP 4 è possibile utilizzare le zecche per implementare la gestione degli errori di tipo eccezionale.

Le zecche possono essere utilizzate anche per altre cose, come l'implementazione di un'applicazione basata su eventi (ad esempio un gioco).

+0

Mi chiedo se ReactPHP abbia mai usato questo tick di dichiarazione per il suo ciclo di eventi? – CMCDragonkai

0

Ho trovato un caso d'uso particolarmente interessante per le zecche non delineate ancora qui.

Mi trovavo di fronte a uno scenario nel mio daemon in cui volevo usare pcntl_fork e assicurarmi che fosse successo esattamente quando mi aspettavo troppo, ma i sintomi dovevano mostrarmi il contrario. Il problema si riduce in 2 parti, (1) Come zend-ng (il nuovo motore di PHP7) mette insieme le esecuzioni C in base alle direttive PHP compilate, cioè tra ogni gruppo di esecuzioni abbiamo un 'tick' e (2) Come risorse sono esposti a te in PHP, cioè i descrittori di file sono creati sull'O/S dal codice C che può o meno essere nel blocco di esecuzione previsto quando compilato dal tuo codice in C.

In termini semplici, ho aperto un socket nel processo padre e in un processo figlio lo ho usato, semplice vero? beh, la risorsa nel processo figlio non era sempre presente come previsto e in tutti i casi il processo genitore non è stato terminato (che normalmente spiega perché perdi l'accesso alle risorse aperte)

Forzare PHP ad annunciare quando un segno di spunta viene eseguito dopo che un blocco di esecuzione in realtà ha costretto zend-ng ad essere un po 'meno efficiente e garantire che i miei blocchi di esecuzione non siano stati eseguiti come previsto.