8 September 2010

Ловим SIGINT в PHP, или как уйти красиво

SIGINT — сигнал, посылаемый процессу, когда в консоли пользователь наживает Ctrl+C, т. е. хочет завершить программу. Как же его можно отловить и нормально завершиться именно в том месте, в котором нужно?

Всё, как оказалось, довольно просто.

s.php:

<?php

declare(ticks = 1);

$GLOBALS['stop'] = false;
function stop() {
    $GLOBALS['stop'] = true;
}

pcntl_signal(SIGINT, 'stop');

while (!$GLOBALS['stop']) {
    echo "Hello!\n";
    sleep(1);
}

echo "Good bye!\n";

И сам запуск:

$> php ./s.php 
Hello!
Hello!
Hello!
^CGood bye!
$>

P.S. Метод объекта в качестве функции обратного вызова работает, проверено.

2 comments:

mikhail said...

Не знал про declare, спасибо за инфу!

Alexey Shockov said...

Всегда пожалуйста :) Скоро ещё выложу, как делать демона без единой строчки кода на PHP...