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

# pcntl_signal

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

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

### Описание

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

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

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

`signal`

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

`handler`

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

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

  function 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() - Ожидает или возвращает статус порождённого дочернего процесса

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open