note 110048 deleted from function.pcntl-signal-dispatch by googleguy

From: Date: Fri, 14 Sep 2012 12:59:40 +0000
Subject: note 110048 deleted from function.pcntl-signal-dispatch by googleguy
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-190764@lists.php.net to get a copy of this message
Note Submitter: admin at infarmer dot ru ---- <?php function signal_handler($signal) { global $i; print "Caught SIGALRM ($i) \n"; pcntl_alarm(1); } pcntl_signal(SIGALRM, "signal_handler", true); pcntl_alarm(1); // Обработка сигнала на каждом тике declare(ticks = 1); while(true){ $i=1; // какая то сложная вычислительная работа, while($i<10000000){ $i++; } echo 'end'.PHP_EOL; // Единоразовая обработка сигнала # pcntl_signal_dispatch(); } ?> OUTPUT: > php test.php Caught SIGALRM (1376814) Caught SIGALRM (4130636) Caught SIGALRM (6884781) Caught SIGALRM (9637491) end Caught SIGALRM (1013758) ^C ======== Теперь если закомментировать declare(ticks = 1); и раскомментировать pcntl_signal_dispatch(); Увидим следующее: OUTPUT: > php test.php Caught SIGALRM (10000000) end Caught SIGALRM (10000000) ^C И все это означает, что сигнал в первом случае ( declare(ticks = 1) ) прервет работу скрипта, выполнит привязанную функцию и вернется и продолжит работу. А при использовании pcntl_signal_dispatch() - обработка сигнала будет произведена когда мы сами это укажем. Кстати, если вместо ( какая то сложная вычислительная работа ) - подставить <?php sleep(5) ?>, то что при использовании pcntl_signal_dispatch(), что при declare(ticks = 1) - сигналы будут срабатывать каждую секунду.

« previous php.notes (#190764) next »