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

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

person zhaozhi    schedule 28.07.2013    source источник


Ответы (1)


Незначительное наблюдение (укажите имя функции, пожалуйста):

pcntl_signal(SIGCHLD, 'sigHandler', false);

Задействовано два разных API.

  • Вызов pcntl_wait() блокируется до тех пор, пока не получит уведомление от ядра.
  • The interrupt handling is an event loop inside the PHP interpreter. This is a hack feature and as of PHP5.3, there is a better way to do it ~ pcntl_signal_dispatch().
    • To answer to question, having declare ticks is like turning your mobile ringtone ON, or otherwise you never notice incoming calls.
    • Метод PHP5.3 намного лучше спроектирован и намного более управляем.
    • Обработчиком по умолчанию для большинства сигналов является sigignore, который получает прерывание и ничего не делает. Поскольку вы зарегистрировали обработчик пользователя, я сомневаюсь, что он используется.
    • Мне никогда не удавалось обнаружить значение по умолчанию для тиков, если оно не было установлено напрямую.
    • Установка галочек на маленькое значение делает скрипты немного медленнее, но вам нужно выполнять интенсивную обработку и мониторинг, чтобы заметить это. Это делает менее предсказуемой стоимость выполнения, я думаю, из-за копирования вещей в стеке.
    • Без объявления тиков или pcntl_signal_dispatch() сигнал никогда не принимается. Если вы пишете простые веб-страницы, которые быстро закрываются; это может быть наиболее разумной политикой.
    • объявить галочки необходимо тщательно протестировать, так как он имеет запутанные правила области действия. Самый безопасный способ поместить его в начало вашего первого скрипта, например use strict в Perl.
person Owen Beresford    schedule 28.07.2013