mougrim/pcntl-signal-handler

PCNTL signal handler for PHP

v1.0.2 2013-11-25 10:19 UTC

README

Библиотка позволяет назначать несколько обработчиков одного и тогоже сигнала. Особенно это актуально для сигнала SIGHUP.

Для версии php меньше чем 5.3

Помимо описанного выше класс Mougrim_Pcntl_SignalHandler эмулирует pcntl_signal_dispatch(), которая досупна только с версии php 5.3.0 Входной файл signalExampleRun.php:

<?php
// в начале подключаем SignalHandler, что бы был вызван declare(ticks = 1);
require_once dirname(__FILE__) . "/src/lt5.3/Mougrim/Pcntl/SignalHandler.php";
require_once dirname(__FILE__) . "/SignalExample.php";;
$signalHandler = new Mougrim_Pcntl_SignalHandler();
$signalExample = new SignalExample($signalHandler);
$signalExample->run();

Файл SignalExample.php:

<?php
class SignalExample
{
    private $signalHandler;

    public function __construct(Mougrim_Pcntl_SignalHandler $signalHandler)
    {
        $this->signalHandler = $signalHandler;
    }

    public function run()
    {
        // добавляем обработчик сигнала SIGTERM
        $this->signalHandler->addHandler(SIGTERM, array($this, 'terminate'));
        // добавляем обработчик сигнала SIGINT
        $this->signalHandler->addHandler(SIGINT, array($this, 'terminate'));

        while(true)
        {
            $this->signalHandler->dispatch();

            // итерация цикла
            echo "итерация цикла\n";
            usleep(300000);
        }
    }

    public function terminate()
    {
        // послать SIGTERM детям
        // ...
        echo "terminate\n";

        exit(0);
    }
}

Для версии php больше либо равно 5.3

Входной файл signalExampleRun53.php:

<?php
// в начале подключаем SignalHandler, что бы был вызван declare(ticks = 1);
require_once dirname(__FILE__) . "/src/gte5.3/Mougrim/Pcntl/SignalHandler.php";
require_once dirname(__FILE__) . "/SignalExample53.php";;
$signalHandler = new \Mougrim\Pcntl\SignalHandler();
$signalExample = new SignalExample53($signalHandler);
$signalExample->run();

Файл SignalExample53.php:

<?php
class SignalExample53
{
    private $signalHandler;

    public function __construct(\Mougrim\Pcntl\SignalHandler $signalHandler)
    {
        $this->signalHandler = $signalHandler;
    }

    public function run()
    {
        // добавляем обработчик сигнала SIGTERM
        $this->signalHandler->addHandler(SIGTERM, array($this, 'terminate'));
        // добавляем обработчик сигнала SIGINT
        $this->signalHandler->addHandler(SIGINT, array($this, 'terminate'));

        while(true)
        {
            $this->signalHandler->dispatch();

            // итерация цикла
            echo "итерация цикла\n";
            usleep(300000);
        }
    }

    public function terminate()
    {
        // послать SIGTERM детям
        // ...
        echo "terminate\n";

        exit(0);
    }
}