2013-07-28 15 views
7

Ho un codice come questo, e voglio capire come funziona la forcella, ma sono confuso con declare(ticks=1). quando lo metto nella prima riga, dopo che il processo figlio è terminato, verrà chiamato il gestore di segnale, che è quello che voglio; ma quando lo rimuovo, il gestore del segnale non sarà mai chiamato! Quindi, voglio sapere in che modo le zecche influenzano l'elaborazione del segnale.Qual è la relazione tra declare (tick) e un gestore di segnale in php

<?php 
declare(ticks=1); 
function sigHandler($signal) 
{ 
    echo "a child exited\n"; 
} 
pcntl_signal(SIGCHLD, sigHandler, false); 
echo "this is " . posix_getpid() . PHP_EOL; 
for($i=0; $i<3; $i++) 
{ 
    $pid = pcntl_fork(); 
    if($pid == -1) 
    { 
     echo 'fork failed ' . PHP_EOL; 
    } 
    else if($pid) 
    { 
    } 
    else 
    { 
     $pid = posix_getpid(); 
     echo 'child ' . $pid . ' ' . time() . PHP_EOL; 
     sleep(rand(2,5)); 
     echo 'child ' . $pid . ' done ' . time() . PHP_EOL; 
     exit(0); 
    } 
} 
do 
{ 
    $pid = pcntl_wait($status); 
    echo 'child quit ' . $pid . PHP_EOL; 
}while($pid > 0); 
echo 'parent done' . PHP_EOL; 
?> 

risposta

9

osservazione Minore (citare il nome della funzione pls.):

pcntl_signal(SIGCHLD, 'sigHandler', false); 

Ci sono due diverse API coinvolti.

  • La chiamata pcntl_wait() sta bloccando finché non riceve una notifica dal kernel.
  • La gestione degli interrupt è un loop di eventi all'interno dell'interprete PHP. Questa è una funzione di hacking e da PHP5.3, c'è un modo migliore per farlo ~ pcntl_signal_dispatch().
    • Per rispondere alla domanda, avendo declare zecche è come trasformare la suoneria sul cellulare, o in altro modo non avete mai notato le chiamate in arrivo.
    • Il metodo PHP5.3 è molto più ingegnoso e molto più controllabile.
    • Il gestore di segnali predefinito per la maggior parte dei segnali è sigignore, che riceve l'interrupt e non fa nulla. Come hai registrato il gestore utente, dubito che questo venga usato.
    • Non sono mai stato in grado di scoprire il valore predefinito per i segni di graduazione, se non impostato direttamente.
    • L'impostazione di tick su un valore basso rende gli script più veloci, ma è necessario eseguire pesanti operazioni di elaborazione e monitoraggio per notarlo. Rende un costo di esecuzione meno prevedibile, credo a causa della copia di cose in giro.
    • Senza declare ticks o pcntl_signal_dispatch(), il segnale non viene mai rilevato. Se stai scrivendo pagine Web semplici, che terminano rapidamente; questa potrebbe essere la politica più sensata.
    • declare ticks deve essere testato con attenzione, in quanto ha regole di ambito confusionario. Il metodo più sicuro per metterlo in testa al tuo primo script, come , usa il rigo in Perl.
+0

grazie per la risposta – zhaozhi