CakePHP 2.10 - переподключение MySQL после остановки сервера - PullRequest
0 голосов
/ 13 марта 2019

Я использую клиентскую оболочку cakephp (2.10), запускаемую Cli, чтобы создать бесконечный цикл с задержкой каждую секунду, который проверяет в БД новые строки (уведомления) и выполняет действия на основе данных строк.

Я столкнулся с проблемой, что иногда сервер MySQL не доступен (не может работать на этой части). Я смоделировал эту часть с service mysql stop / start. Поэтому я хочу решить проблему и восстановить соединение, если это произойдет.

Вот код:

App::uses('NotificationsController', 'Controller');
App::uses('AppController', 'Controller');
App::uses('ConnectionManager', 'Model');

class LuxovNotificationDispatcherShell extends AppShell {
    private $n_h=null;
    private $app_h=null;
    private $time_step=1;//(1s)

    public function start(){
        $this->n_h = NotificationsController::instance();
        $this->app_h = new AppController();
        $this->app_h->_log('debug', __CLASS__.'->'.__FUNCTION__, 'process');

        while(true){
            sleep($this->time_step);
            $this->get_new();
        }
    }

    private function get_new(){
        try{
            // get all new notifications
            $data = $this->n_h->_getAll([
                    'order'=>['timestamp ASC'],
                    'conditions'=>['is_new'=>1]
                ]
            );

            // if there is data
            if (!empty($data)){
                foreach($data as $line){
                    //do things
                }
            }
        }
        catch(PDOException $err){
            $this->app_h->_log('debug', 'error with mysql connection', 'process');
            $this->app_h->_log('debug', $err->getMessage(), 'process');
        }
    }
}

Ничего не делая в перехватчике, я получил этот бесконечный журнал без сбоя скрипта, событие, если я вернусь service mysql start:

2019-03-13 10:21:15 Debug: NotificationDispatcherShell->start
2019-03-13 10:21:19 Debug: error with mysql connection
2019-03-13 10:21:19 Debug: SQLSTATE[08S01]: Communication link failure: 1053 Server shutdown in progress
Warning Error: Error while sending QUERY packet. PID=7267 in [[...]/lib/Cake/Model/Datasource/DboSource.php, line 472]

2019-03-13 10:21:21 Warning: Error while sending QUERY packet. PID=7267 in [[...]/lib/Cake/Model/Datasource/DboSource.php, line 472]
2019-03-13 10:21:21 Debug: error with mysql connection
2019-03-13 10:21:21 Debug: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
2019-03-13 10:21:23 Debug: error with mysql connection
2019-03-13 10:21:23 Debug: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

Я попытался добавить повторное соединение в части catch:

$db = ConnectionManager::getDataSource('default');
$db->reconnect();

Я получил другое сообщение и сбой скрипта:

2019-03-13 10:27:53 Debug: NotificationDispatcherShell->start
2019-03-13 10:27:57 Debug: error with mysql connection
2019-03-13 10:27:57 Debug: SQLSTATE[08S01]: Communication link failure: 1053 Server shutdown in progress
Error: Database connection "Mysql" is missing, or could not be created.
#0 [...]/lib/Cake/Model/Datasource/DboSource.php(286): Mysql->connect()
#1 [...]/app/Console/Command/NotificationDispatcherShell.php(78): DboSource->reconnect()
#2 [...]/app/Console/Command/NotificationDispatcherShell.php(46): LuxovNotificationDispatcherShell->get_new()
#3 [...]/lib/Cake/Console/Shell.php(459): LuxovNotificationDispatcherShell->start()
#4 [...]/lib/Cake/Console/ShellDispatcher.php(219): Shell->runCommand('start', Array)
#5 [...]/lib/Cake/Console/ShellDispatcher.php(66): ShellDispatcher->dispatch()
#6 [...]/app/Console/cake.php(47): ShellDispatcher::run(Array)
#7 {main}

Как правильно обращаться с этим?

...