Esta pagina se ve mejor con JavaScript habilitado

Gestor de señales en php

 ·  🎃 kr0m

Poder captar señales desde nuestro código en php puede resultar muy útil en ciertas ocasiones, por ejemplo cuando se abre un fichero para guardar logs y no se cierra jamás este crecerá de forma indefinida y aunque se trunque el fichero el file descriptor seguirá ocupado por nuestro proceso impidiendo liberar el espacio. Para resolver este problema podemos hacer uso de las señales, el código recibe la señal, cierra el fichero y lo vuelve a abrir permitiendo al SO liberar el espacio.

Compilamos php con la use flag pcntl:

vi /etc/portage/package.use/php

dev-lang/php apache2 berkdb bzip2 cli crypt ctype curl curlwrappers exif fileinfo filter ftp gd gdbm hash iconv imap intl json mysql mysqli nls odbc pdo phar posix readline session simplexml soap sockets sqlite3 ssl sysvipc threads tokenizer unicode xml xmlreader xmlrpc xmlwriter zip zlib threads fpm cgi truetype bcmath ldap pcntl

Programamos nuestro pequeño artilugio:

vi signal.php

<?php
declare(ticks = 1);

echo "Installing signal handler...\n";
pcntl_signal(SIGUSR1,  function($signo) {
     echo "Signal handler called\n";
});

echo "Done\n";
echo "PID: " . posix_getpid() . "\n";
echo "Waiting signal\n";

while(true){
    sleep(1);
}

?>

Probemos nuestro pedacito de código:

php signal.php

Installing signal handler...
Done
PID: 29763
Waiting signal

Enviamos la señal SIGUSR1:

kill -SIGUSR1 PID

El código funciona como es esperado captando la señal:

Installing signal handler...
Done
PID: 29763
Waiting signal
Signal handler called
Si te ha gustado el artículo puedes invitarme a un RedBull aquí