Как отследить завершение работы socket. Swoole

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
evgeniy123
Сообщения: 392
Зарегистрирован: 2011.11.01, 17:29

Как отследить завершение работы socket. Swoole

Сообщение evgeniy123 » 2018.08.27, 10:12

Начал использовать 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 методе писал отработку и ничего не срабатывает в ней. В чем может быть проблема подскажите?

noLogicOnlyWar
Сообщения: 75
Зарегистрирован: 2017.07.04, 20:53

Re: Как отследить завершение работы socket. Swoole

Сообщение noLogicOnlyWar » 2018.08.27, 14:00

cntr+c отсылает signint твоему процессу. Используй pcntl_signal чтобы отловить его. Со swoole не работал, но подозреваю что onShutdown подпишется на вызов shutdown метода.

evgeniy123
Сообщения: 392
Зарегистрирован: 2011.11.01, 17:29

Re: Как отследить завершение работы socket. Swoole

Сообщение evgeniy123 » 2018.08.27, 18:45

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
           }

   }

noLogicOnlyWar
Сообщения: 75
Зарегистрирован: 2017.07.04, 20:53

Re: Как отследить завершение работы socket. Swoole

Сообщение noLogicOnlyWar » 2018.08.27, 21:01

не хватает

Код: Выделить всё

case SIGINT:
	...
	exit;
в блоке switch

evgeniy123
Сообщения: 392
Зарегистрирован: 2011.11.01, 17:29

Re: Как отследить завершение работы socket. Swoole

Сообщение evgeniy123 » 2018.08.27, 22:40

noLogicOnlyWar писал(а):
2018.08.27, 21:01
не хватает

Код: Выделить всё

case SIGINT:
	...
	exit;
в блоке switch
Не помогло к сожалению :(

Код: Выделить всё

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
        }

    }
    

evgeniy123
Сообщения: 392
Зарегистрирован: 2011.11.01, 17:29

Re: Как отследить завершение работы socket. Swoole

Сообщение evgeniy123 » 2018.08.27, 23:24

Это полный код:

Код: Выделить всё


   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");
        }
    }
    

noLogicOnlyWar
Сообщения: 75
Зарегистрирован: 2017.07.04, 20:53

Re: Как отследить завершение работы socket. Swoole

Сообщение noLogicOnlyWar » 2018.08.27, 23:46

declare(ticks=1) не забыли? Если не работает под виндой то не берусь больше подсказывать, на никсах это рабочий код.
Принципиально отлавливать ctrl+c? Я так считаю что стоит использовать запрос из вне для отключения.

evgeniy123
Сообщения: 392
Зарегистрирован: 2011.11.01, 17:29

Re: Как отследить завершение работы socket. Swoole

Сообщение evgeniy123 » 2018.08.28, 00:51

noLogicOnlyWar писал(а):
2018.08.27, 23:46
declare(ticks=1) не забыли? Если не работает под виндой то не берусь больше подсказывать, на никсах это рабочий код.
Принципиально отлавливать ctrl+c? Я так считаю что стоит использовать запрос из вне для отключения.
declare(ticks=1) не забыли?
Не забыл :)
на никсах это рабочий код.
Ubuntu 16.04
Я так считаю что стоит использовать запрос из вне для отключения.
На каком этапе предлагаете убивать таблицу связей ? Мне бы надежно чтобы чтобы не оставались хвосты после отключения

noLogicOnlyWar
Сообщения: 75
Зарегистрирован: 2017.07.04, 20:53

Re: Как отследить завершение работы socket. Swoole

Сообщение noLogicOnlyWar » 2018.08.28, 22:05

evgeniy123 писал(а):
2018.08.28, 00:51

Ubuntu 16.04
Ну тогда проводите изыскания с кодом, очевидно где то не досмотрели.
На каком этапе предлагаете убивать таблицу связей ? Мне бы надежно чтобы чтобы не оставались хвосты после отключения
Риторический вопрос :) Я вообще не вижу смысла тогда в механизме постоянного хранения тут, храните связь в оперативке и нет проблемы.

evgeniy123
Сообщения: 392
Зарегистрирован: 2011.11.01, 17:29

Re: Как отследить завершение работы socket. Swoole

Сообщение evgeniy123 » 2018.08.28, 22:11

Говоря про базу я не имел ввиду всегда 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


Ответить