У меня есть такой код, как этот, и я хочу понять, как работает fork, но я смущен declare(ticks=1)
. когда я помещаю его в первую строку, после завершения дочернего процесса обработчик сигнала будет вызван, и это то, что я хочу; но когда я его удалю, обработчик сигнала никогда не будет вызван! Итак, я хочу знать, как тики влияют на обработку сигнала.
<?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; ?>
Незначительное наблюдение (укажите имя функции pls.):
pcntl_signal(SIGCHLD, 'sigHandler', false);
Существует два разных API.
- Вызов pcntl_wait () блокируется, пока не получит уведомление от ядра.
- Обработка прерываний – это цикл событий внутри интерпретатора PHP. Это хакерская функция, и с PHP5.3 есть лучший способ сделать это ~ pcntl_signal_dispatch ().
- Чтобы ответить на вопрос, объявить тики – это как включить ваш мобильный рингтон, иначе вы никогда не заметите входящие звонки.
- Метод PHP5.3 намного лучше разрабатывает и обладает большей управляемостью.
- Обработчик сигнала по умолчанию для большинства сигналов является сигнером, который получает прерывание и ничего не делает. Поскольку вы зарегистрировали обработчик пользователя, я сомневаюсь, что это используется.
- Я никогда не мог узнать значение по умолчанию для тиков, если оно не задано напрямую.
- Установка тиков на небольшое значение делает скрипты abit работать медленнее, но вам нужно делать тяжелую обработку и мониторинг, чтобы заметить это. Это делает менее прогнозируемую стоимость исполнения, я думаю, из-за копирования вещей в стеке.
- Без объявления тиков или pcntl_signal_dispatch () сигнал никогда не поднимается. Если вы пишете простые веб-страницы, которые быстро заканчиваются; это может быть самая разумная политика.
- заявить, что тики необходимо тщательно проверять, так как это путает правила области. Самый безопасный способ поставить его во главе вашего первого скрипта, например, использовать строго в Perl.