Страница 1 из 1
Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.27, 10:12
evgeniy123
Начал использовать Swoole и сталкнулся с такой проблемой что при ctrl+C когла сервер выключаю то не могу отследить этот момент в коде что бы прибить в таблице все соотношееия id_socket / user_id. Повесил на сервер слушатель
Код: Выделить всё
$this->server->on ('shutdown', [$this, 'onShutdown' ] )
.......
public function onShutdown(swoole_server $server ){
$this->_server->shutdown();
$this->connection->createCommand('DELETE FROM ' . Authlog::tableName())->execute();
echo "shutting down ...\n";
}
....
. Пишу с телефона. В onShutdown методе писал отработку и ничего не срабатывает в ней. В чем может быть проблема подскажите?
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.27, 14:00
noLogicOnlyWar
cntr+c отсылает signint твоему процессу. Используй pcntl_signal чтобы отловить его. Со swoole не работал, но подозреваю что onShutdown подпишется на вызов shutdown метода.
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.27, 18:45
evgeniy123
noLogicOnlyWar писал(а): ↑2018.08.27, 14:00
cntr+c отсылает signint твоему процессу. Используй pcntl_signal чтобы отловить его. Со swoole не работал, но подозреваю что onShutdown подпишется на вызов shutdown метода.
Так и сделал. Но сейчас почему то не работает CTRL+C.
Код: Выделить всё
if (extension_loaded("pcntl")) {
pcntl_signal_dispatch();
//Add signal handlers to shut down the bot correctly if its getting killed
pcntl_signal(SIGTERM, array($this, "signal_handler"));
pcntl_signal(SIGINT, array($this, "signal_handler"));
} else {
//die("Please make sure the pcntl PHP extension is enabled.\n");
}
function signal_handler($signo)
{
switch ($signo) {
case SIGTERM:
// gestion de l'extinction
exit;
break;
case SIGHUP:
// gestion du redémarrage
break;
case SIGUSR1:
echo "Reçu le signe SIGUSR1...\n";
break;
default:
// gestion des autres signaux
}
}
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.27, 21:01
noLogicOnlyWar
не хватает
в блоке switch
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.27, 22:40
evgeniy123
Не помогло к сожалению
Код: Выделить всё
function signal_handler($signo)
{
switch ($signo) {
case SIGTERM:
// gestion de l'extinction
exit;
break;
case SIGINT:
// gestion du redémarrage
exit;
break;
case SIGHUP:
exit;
// gestion du redémarrage
break;
case SIGUSR1:
echo "Reçu le signe SIGUSR1...\n";
break;
default:
// gestion des autres signaux
}
}
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.27, 23:24
evgeniy123
Это полный код:
Код: Выделить всё
public function run()
{
if ($this->_type == 'ws') {
$this->_server = new swoole_websocket_server($this->_host, $this->_port, $this->_mode, $this->_socketType);
} else {
$this->_server = new swoole_websocket_server($this->_host, $this->_port, $this->_mode, $this->_socketType | SWOOLE_SSL);
}
$this->_server->set($this->_config);
$this->_server->on('open', [$this, 'onOpen']);
$this->_server->on('message', [$this, 'onMessage']);
$this->_server->on('task', [$this, 'onTask']);
$this->_server->on('finish', [$this, 'onFinish']);
$this->_server->on('close', [$this, 'onClose']);
$this->_server->on('shutdown', [$this, 'onShutdown']);
$this->_server->start();
if (extension_loaded("pcntl")) {
// pcntl_signal_dispatch();
//Add signal handlers to shut down the bot correctly if its getting killed
pcntl_signal(SIGTERM, [$this, "signal_handler"]);
pcntl_signal(SIGINT, [$this, "signal_handler"]);
pcntl_signal(SIGUSR1, [$this, "signal_handler"]);
pcntl_signal(SIGHUP, [$this, "signal_handler"]);
} else {
die("Please make sure the pcntl PHP extension is enabled.\n");
}
}
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.27, 23:46
noLogicOnlyWar
declare(ticks=1) не забыли? Если не работает под виндой то не берусь больше подсказывать, на никсах это рабочий код.
Принципиально отлавливать ctrl+c? Я так считаю что стоит использовать запрос из вне для отключения.
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.28, 00:51
evgeniy123
noLogicOnlyWar писал(а): ↑2018.08.27, 23:46
declare(ticks=1) не забыли? Если не работает под виндой то не берусь больше подсказывать, на никсах это рабочий код.
Принципиально отлавливать ctrl+c? Я так считаю что стоит использовать запрос из вне для отключения.
declare(ticks=1) не забыли?
Не забыл
на никсах это рабочий код.
Ubuntu 16.04
Я так считаю что стоит использовать запрос из вне для отключения.
На каком этапе предлагаете убивать таблицу связей ? Мне бы надежно чтобы чтобы не оставались хвосты после отключения
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.28, 22:05
noLogicOnlyWar
Ну тогда проводите изыскания с кодом, очевидно где то не досмотрели.
На каком этапе предлагаете убивать таблицу связей ? Мне бы надежно чтобы чтобы не оставались хвосты после отключения
Риторический вопрос
Я вообще не вижу смысла тогда в механизме постоянного хранения тут, храните связь в оперативке и нет проблемы.
Re: Как отследить завершение работы socket. Swoole
Добавлено: 2018.08.28, 22:11
evgeniy123
Говоря про базу я не имел ввиду всегда mysql. Может Memcache тогла...
Сейчас пытаюсь сделать systemd но пока выдает
Код: Выделить всё
[/etc/systemd/system/websocket.service:6] Executable path is not absolute, ignoring: php /var/www/project/yii auth-log/delete
На
Код: Выделить всё
ExecStop=/usr/bin/nohup /usr/bin/php -f /var/www/project/yii auth-log/delete > /dev/null 2>&1