pcntl_signal
(PHP 4 >= 4.1.0, PHP 5, PHP 7)
pcntl_signal — Установка обработчика сигнала
Описание
Функция pcntl_signal() устанавливает новый
обработчик сигнала или заменяет текущий обработчик сигнала,
указанный в аргументе signo
.
Список параметров
-
signo
-
Номер сигнала.
-
handler
-
Обработчик сигнала. Это может быть или callable, указатель на функцию, которая будет запущена для обработки сигнала, или значение одной из глобальных констант:
SIG_IGN
илиSIG_DFL
, которые, соответственно, либо приведут к игнорированию сигнала, либо восстановлению обработчика по умолчанию.Если передан тип callable, он должен иметь следующую сигнатуру:
-
signo
- Номер обрабатываемого сигнала.
-
siginfo
- Если операционная система поддерживает структуры siginfo_t, можно передать массив c иформацией о сигнале соответствующей структуры.
Замечание:
Обратите внимание, что когда вы задаете в качестве обработчика метод объекта, счетчик ссылок на данный объект будет увеличен на единицу, что сохранит его в памяти до тех пор, пока вы либо не смените обработчик на что-то другое, либо до тех пор пока скрипт полностью не завершит свою работу.
-
-
restart_syscalls
-
Определяет, должен ли использоваться перезапуск системного вызова при поступлении сигнала.
Возвращаемые значения
Возвращает true
в случае успешного завершения или false
в случае возникновения ошибки.
Список изменений
Версия | Описание |
---|---|
7.1.0 | Начиная с PHP 7.1.0 обработчику callback-функции передается второй аргумент, содержащий структуру siginfo определенного сигнала. Эти данные будут переданы только в том случае, если операционная система поддерживает структуры siginfo_t. Если в операционной системе не реализована поддержка структуры siginfo_t, то в качестве второго аргумента будет передан NULL. |
Примеры
Пример #1 Пример использования pcntl_signal()
<?php
// Обязательно
declare(ticks = 1);
// функция обработки сигнала
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 процессу с текущим id (т.е. себе)
// для использования функций posix_* требуется библиотека-расширение posix
posix_kill(posix_getpid(), SIGUSR1);
echo "Завершено\n";
?>
Примечания
pcntl_signal() не собирает обработчики сигналов в стек, а заменяет их.
Смотрите также
- pcntl_fork() - Разветвить (fork) текущий запущенный процесс
- pcntl_waitpid() - Ожидает или возвращает статус порожденного дочернего процесса