pcntl_signal

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_signalУстанавливает обработчик сигнала

Описание

pcntl_signal(int $signal, callable|int $handler, bool $restart_syscalls = true): bool

Функция pcntl_signal() устанавливает новый или заменяет текущий обработчик сигнала signal.

Список параметров

signal

Номер сигнала.

handler

Обработчик сигнала. В параметр передают или callable-выражение, которое запустится для обработки сигнала, или глобальную константу: SIG_IGN для игнорирования сигнала или SIG_DFL для восстановления обработчика по умолчанию.

Для аргумента с псевдотипом callable определяют следующую сигнатуру:

handler(int $signo, mixed $siginfo): void
signal
Номер обрабатываемого сигнала.
siginfo
При поддержке структур siginfo_t операционной системой в аргумент поступит массив со специфичной для сигнала информацией.

Замечание:

Обратите внимание, при установке метода объекта как обработчика счётчик ссылок на такой объект увеличится на единицу, что сохранит объект в памяти либо до замены обработчика, либо пока скрипт не завершит работу.

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() не накапливает вызовы обработчиков сигналов в стек, а заменяет текущий.

Методы диспетчеризации

В модуле доступны следующие способы диспетчеризации обработчиков сигналов:

  • Асинхронная обработка, которую включает функция pcntl_async_signals(). Это рекомендуемый метод
  • Настройка частоты тиков
  • Ручная диспетчеризация функцией pcntl_signal_dispatch()

При асинхронной диспетчеризации сигналов или выполнении на основе тиков блокирующие функции наподобие sleep() иногда прерываются.

Смотрите также

  • Страница » Signal (IPC) на сайте Wikipedia
  • pcntl_async_signals() - Включить/отключить асинхронную обработку сигналов, либо получить текущий статус
  • pcntl_fork() - Разветвить (fork) текущий запущенный процесс
  • pcntl_signal_dispatch() - Вызывает обработчики для ожидающих сигналов
  • pcntl_waitpid() - Ожидает или возвращает статус порождённого дочернего процесса