(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_signal — Instala um manipulador de sinal
A função pcntl_signal() instala um novo
manipulador de sinal ou substitui o manipulador de sinal atual pelo sinal indicado por signal
.
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:
signal
siginfo
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.
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. |
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";
?>
pcntl_signal() não empilha os manipuladores de sinal, mas os substitui.
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.