Intereting Posts
MYSQL получает все сгруппированные результаты по одному запросу с подсчетом строк Получение идентификатора электронной почты отправителя при получении писем от Gmail как выполнить функцию в модели без вызова контроллера, структура YII Сообщение об ошибке при отправке формы PHP с пустыми полями php SimpleXML проверяет, существует ли ребенок Что делает PHP-расширение shmop? Возвращение локального времени из метки времени unix с идентификатором часового пояса в php R не работает должным образом при использовании функции PHP exec () Количество эхо-записей MySQL, которое имеет одинаковый идентификатор сеанса Curl возвращает false на сервере хостинга (завивка включена) PHP показывает только значимые (отличные от нуля) десятичные знаки Как передать переменную внутри функции? нужны идеи, чтобы отображать только некоторые пиксели и выделять оставшиеся пиксели Как вызвать переадресацию до завершения php-скрипта? Phalcon \ Mvc \ Model :: validation () и немодельные валидаторы

Какова связь между объявлением (тиками) и обработчиком сигналов в php

У меня есть такой код, как этот, и я хочу понять, как работает 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.