pcntl_signal
PHP Manual
PHP Manual»Funciones PCNTL»pcntl_signal

pcntl_signal

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

pcntl_signal — Instala un gestor de señales

Descripción

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

pcntl_signal() instala un nuevo gestor de señales o reemplaza el gestor de señales actual para la señal indicada por el parámetro signal.

Parámetros

signal

El número de la señal.

handler

El gestor de señales. Puede ser un callable, que será llamado para gestionar la señal, o bien una de las dos constantes globales SIG_IGN o SIG_DFL, que, respectivamente, ignorarán la señal o restaurarán el gestor de señales por defecto.

Si se proporciona un callable, debe implementar la siguiente firma:

function handler(int $signo, mixed $siginfo): void
signo

La señal a gestionar.

siginfo

Si el sistema operativo soporta las estructuras siginfo_t, esto será un array de información de la señal que depende de la señal.

Nota:

Cuando el gestor se configura con un método de objeto, el contador de referencia de ese objeto se incrementa, lo que lo hace persistente hasta que el gestor se cambie por otro, o hasta que el script termine.

restart_syscalls

Especifica si la llamada al sistema de reinicio (restarting) debe ser utilizada cuando llega esta señal.

Nota:

Aunque este parámetro tiene como valor predeterminado true, dicho valor predeterminado no se aplica a SIGALRM: cuando restart_syscalls no se pasa y signal es SIGALRM, el reinicio de las llamadas al sistema queda desactivado. Pase true explícitamente para habilitarlo en SIGALRM.

Valores devueltos

Esta función retorna true en caso de éxito o false si ocurre un error.

Errores/Excepciones

Se lanza una ValueError si signal es menor que 1 o mayor o igual a NSIG, o si handler es un int distinto de SIG_DFL o SIG_IGN.

Se lanza una TypeError si handler no es ni un callable ni un int.

Historial de cambios

Versión Descripción
7.4.0 restart_syscalls ahora se tiene en cuenta para SIGALRM; anteriormente el reinicio de llamadas al sistema siempre estaba desactivado para esa señal. Cuando no se pasa el argumento, el reinicio de llamadas al sistema permanece desactivado para SIGALRM.
7.1.0 A partir de PHP 7.1.0 el gestor de la función de retrollamada tiene un segundo argumento que contiene el siginfo de esa señal específica. Estos datos solo se proporcionan si el sistema operativo tiene la estructura siginfo_t. Si el sistema operativo no implementa siginfo_t, se proporciona NULL.

Ejemplos

Ejemplo #1 Ejemplo con pcntl_signal()

<?php
pcntl_async_signals(true);

// gestor de señales del sistema
function sig_handler($signo)
{

     switch ($signo) {
         case SIGTERM:
             // gestión de la extinción
             exit;
             break;
         case SIGHUP:
             // gestión del reinicio
             break;
         case SIGUSR1:
             echo "Recibida la señal SIGUSR1...\n";
             break;
         default:
             // gestión de otras señales
     }

}

echo "Instalación del gestor de señales...\n";

// Instalación de los gestores de señales
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");

// o bien utilice un objeto
// pcntl_signal(SIGUSR1, array($obj, "hacer_algo"));

echo"Generación de una señal SIGUSR1 a mí mismo...\n";

// envío de SIGUSR1 al identificador de proceso actual
// las funciones posix_* requieren la extensión posix
posix_kill(posix_getpid(), SIGUSR1);

echo "Hecho\n";

?>

Notas

La función pcntl_signal() no apila los gestores de señales, sino que los reemplaza.

Método de dispatch

Existen varios métodos para dispatchar los gestores de señales:

Cuando las señales son dispatchadas de manera asíncrona o utilizando una ejecución basada en ticks, las funciones bloqueantes como sleep() pueden ser interrumpidas.

Véase también

To Top