(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_signal — Устанавливает обработчик сигнала
Функция pcntl_signal() устанавливает новый или заменяет текущий
обработчик сигнала signal
.
signal
Номер сигнала.
handler
Обработчик сигнала. В параметр передают или callable-выражение,
которое запустится для обработки сигнала,
или глобальную константу:
SIG_IGN
для игнорирования сигнала
или SIG_DFL
для восстановления обработчика по умолчанию.
Для аргумента с псевдотипом callable определяют следующую сигнатуру:
signal
siginfo
Замечание:
Обратите внимание, при установке метода объекта как обработчика счётчик ссылок на такой объект увеличится на единицу, что сохранит объект в памяти либо до замены обработчика, либо пока скрипт не завершит работу.
restart_syscalls
Параметр определяет, перезапускать ли системный вызов при поступлении сигнала.
Функция возвращает true
, если выполнилась успешно, или false
, если возникла ошибка.
Версия | Описание |
---|---|
7.1.0 | Начиная с PHP 7.1.0 callback-функции обработчика передаётся второй аргумент, который содержит структуру siginfo с со специфичной информацией о сигнале. Эти данные передаются, только если операционная система поддерживает структуры siginfo_t, а если в ОС не реализовали поддержку структур siginfo_t, передаётся значение NULL. |
Пример #1 Пример установки обработчика сигнала функцией pcntl_signal()
<?php
pcntl_async_signals(true);
// Функция обработки сигнала
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// Обработка задач остановки
exit;
break;
case SIGHUP:
// Обработка задач перезапуска
break;
case SIGUSR1:
echo "Получен сигнал SIGUSR1...\n";
break;
default:
// Обработка других сигналов
}
}
echo "Установка обработчиков сигналов...\n";
// Устанавливаем функцию как обработчик сигналов
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// или устанавливаем как обработчик метод объекта
// pcntl_signal(SIGUSR1, array($obj, "do_something"));
echo "Генерация сигнала SIGUSR1 для самого себя...\n";
// Отправка сигнала SIGUSR1 самому себе — процессу с текущим идентификатором.
// PHP поддерживает функций семейства posix_* только при загрузке модуля posix
posix_kill(posix_getpid(), SIGUSR1);
echo "Завершено\n";
?>
Функция pcntl_signal() не накапливает вызовы обработчиков сигналов в стек, а заменяет текущий.
В модуле доступны следующие способы диспетчеризации обработчиков сигналов:
При асинхронной диспетчеризации сигналов или выполнении на основе тиков блокирующие функции наподобие sleep() иногда прерываются.