pcntl_signal

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

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

Описание

bool pcntl_signal ( int $signo , callable|int $handler [, bool $restart_syscalls = TRUE ] )

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

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

signo

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

handler

Обработчик сигнала. Это может быть или callable, указатель на функцию, которая будет запущена для обработки сигнала, или значение одой из глобальных констант: SIG_IGN или SIG_DFL, которые, соответственно, либо приведут к игнорированию сигнала, либо восстановлению обработчика по умолчанию.

Если передан тип callable, он должен иметь следующую сигнатуру:

void handler ( int $signo , mixed $signinfo )
signo
Номер обрабатываемого сигнала.
siginfo
Если операционная система поддерживает структуры siginfo_t, можно передать массив c иформацией о сигнале соответствующей структуры.

Замечание:

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

restart_syscalls

Определяет, должен ли использоваться перезапуск системного вызова при поступлении сигнала.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Список изменений

Версия Описание
4.3.0 Начиная с PHP 4.3.0, PCNTL использует "тики" как механизм обработки сигналов, что значительно быстрее предыдущего механизма. Это изменение семантически похоже на использование "user ticks". Вам необходимо использовать оператор declare для указания мест в коде, в которых разрешено срабатывать callback-функциям обработчика сигналов, чтобы их работа была корректной (как показано в примере ниже).
7.1.0 Начиная с PHP 7.1.0 обработчику обратного вызова передается второй аргумент содержащий структуру siginfo определенного сигнала. Эти данные будут переданы только в том случае, если операционная система поддерживает структуры siginfo_t. Если в операционной системе не реализована поддержка структуры siginfo_t, то в качестве второго аргумента будет передан NULL.

Примеры

Пример #1 Пример использования pcntl_signal()

<?php
// Обязательно начиная с версии PHP 4.3.0
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");

// или можете использовать объект, что возможно начиная с версии 4.3.0
// 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() - Ожидает или возвращает статус порожденного дочернего процесса