Esta web utiliza cookies, puedes ver nuestra política de cookies aquí. Si continuas navegando estás aceptándola

Gestor de señales en php


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

Autor: Kr0m -- 07/07/2017 22:03:45