Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
pcntl_signal(SIGTSTP, function () {
system('screen -d -h 1000 -m /usr/bin/php /home/.../daemon.php');
exit;
});
protected $__restartNeeded = false;
protected function initSignalHandlers()
{
pcntl_signal(SIGTSTP, function () { $this->__restartNeeded = true; });
}
protected function receiveSignals()
{
pcntl_signal_dispatch();
if ($this->__restartNeeded) {
system('screen -d -h 1000 -m /usr/bin/php /home/.../daemon.php');
exit;
}
}
$ cat test.php
<?php
declare(ticks=1);
dl('pcntl.so');
pcntl_signal(SIGINT, function() {
echo "Stopped!\n";
exit(0);
});
echo "Enter your name: ";
$name = fgets(STDIN);
echo "Your name is $name";
?>
$ php test.php
Enter your name: youROCK^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C # я нажимал Ctrl+C много раз, затем <Enter>
Stopped!
$
$ cat test-false.php
<?php
declare(ticks=1);
dl('pcntl.so');
pcntl_signal(SIGINT, function() {
echo "Stopped!\n";
exit(0);
}, false);
echo "Enter your name: ";
$name = fgets(STDIN);
echo "Your name is $name";
?>
$ php test-false.php
Enter your name: youROCK^C^CStopped! # я нажал Ctrl+C, потом опять нажал Ctrl+C, и на второй раз оно сработало!
$
$ cat test-mysql.php
<?php
declare(ticks=1);
dl('pcntl.so');
mysql_connect('127.0.0.1', 'root', 'root');
pcntl_signal(SIGINT, function() {
echo "Stopped!\n";
exit(0);
}, false);
echo "Performing long query ...";
mysql_query('SELECT SLEEP(100);');
echo "Done\n";
?>
$ php test-mysql.php
Performing long query ...^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^CStopped! # сишная библиотека libmysql продолжает читать из сокета, несмотря на то, что получает код ошибки EINTR от read()
Обработка pcntl-сигналов в PHP