Я использую клиентскую оболочку 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}
Как правильно обращаться с этим?