Функция sleep и сигналы
Век живи, век учись. Вот уж не знал, что при получении сигнала программой на ПХП, моментально прерывается выполнение функции sleep (и родственных ей time_nanosleep и usleep):
$ php -r 'pcntl_signal(SIGUSR1, "_"); var_dump(sleep(PHP_INT_MAX));' &
[1] 3177
$ kill -USR1 3177
$ int(4294967288)Вообще в Си так же, но где ПХП и где Си. Как и в Си, назад возвращается количество секунд, которые функция не «доспала» (time_nanosleep возвращает массив из секунд и наносекунд, а usleep — NULL). Правда под Виндой есть особенность — sleep при «недосыпе» всегда возвращает 192 (значение константы WAIT_IO_COMPLETION).
Любопытное исключение из правила — time_sleep_until, она сигналы игнорирует. Так что если вам нужна гарантированная по времени задержка, используйте её или напишите обёртку:
function bulletproof_sleep(int $seconds): bool
{
$period = ['seconds' => $seconds, 'nanoseconds' => 0];
while (array_sum($period) > 0) {
$period = time_nanosleep($period['seconds'], $period['nanoseconds']);
if (is_bool($period)) {
return $period;
}
}
return true;
}
Комментарии 4
подозреваю, что time_sleep_until дёргает в итоге посиксовый timer_create. он на сигналы реагировать не должен (потому как обычно это примитив операционки), но при срабатывании сам шлёт вызывающему процессу соответствующий сигнал.