pcntl_signal

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

pcntl_signalInstala um manipulador de sinal

Descrição

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

A função pcntl_signal() instala um novo manipulador de sinal ou substitui o manipulador de sinal atual pelo sinal indicado por signal.

Parâmetros

signal

O número do sinal.

handler

O manipulador de sinal. Pode ser um callable, que será invocado para manipular o sinal, ou qualquer uma das duas constantes globais SIG_IGN ou SIG_DFL, que ignorarão o sinal ou restaurarão o manipulador de sinal padrão, respectivamente.

Se um callable for fornecido, ele deve implementar a seguinte assinatura:

handler(int $signo, mixed $siginfo): void
signal
O sinal que está sendo manipulado.
siginfo
Se os sistemas operacionais suportarem estruturas siginfo_t, este parâmetro será um array de informações de sinal dependentes do sinal.

Nota:

Observe que, quando é definido um manipulador para um método de objeto, a contagem de referências desse objeto é aumentada, o que o faz persistir até que seja alterado o manipulador para outra coisa ou o script termine.

restart_syscalls

Especifica se a reinicialização da chamada do sistema deve ser usada quando este sinal chegar.

Valor Retornado

Retorna true em caso de sucesso ou false em caso de falha.

Registro de Alterações

Versão Descrição
7.1.0 A partir do PHP 7.1.0, a função de retorno do manipulador recebe um segundo argumento contendo o a informação do sinal específico. Este dado é fornecido somente se o sistema operacional tiver a estrutura siginfo_t. Se o sistema operacional não implementar siginfo_t, NULL será fornecido.

Exemplos

Exemplo #1 Exemplo de pcntl_signal()

<?php
pcntl_async_signals
(true);

// função de manipulação de sinal
function sig_handler($signo)
{

switch (
$signo) {
case
SIGTERM:
// manipula tarefas de desligamento
exit;
break;
case
SIGHUP:
// manipula tarefas de reinicialização
break;
case
SIGUSR1:
echo
"Capturado SIGUSR1...\n";
break;
default:
// manipula todas as outras tarefas
}

}

echo
"Installing signal handler...\n";

// configure manipuladores de sinal
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");

// ou use um objeto
// pcntl_signal(SIGUSR1, array($obj, "do_something"));

echo "Gerando sinal SIGUSR1 para si mesmo...\n";

// envia SIGUSR1 ao ID de processo atual
// funções posix_* requerem a extensão posix
posix_kill(posix_getpid(), SIGUSR1);

echo
"Feito\n";

?>

Notas

pcntl_signal() não empilha os manipuladores de sinal, mas os substitui.

Métodos de Despacho

Existem vários métodos de despacho de manipuladores de sinais:

Quando os sinais são despachados de forma assíncrona ou usando execução baseada em tiques, funções de bloqueio como sleep() podem ser interrompidas.

Veja Também