CakePHP 3.1 MySQL ушла
У меня есть сценарий оболочки, который работает непрерывно в цикле.
Он проверяет базу данных на наличие записей и изменяет их при необходимости.
set_time_limit(0);
while(true){
try{
$this->out(mysql_ping());
$companies = $this->findCompanies();
$companies = $this->reduceCompanies($companies, $rules);
$this->processCompanies($companies);
}catch (\Exception $e){
Log::write('debug', $e->getMessage());
$this->out($e->getMessage());
}
sleep(3);
}
Проблема, с которой я столкнулся, заключается в том, что этот скрипт работает нормально, но затем случайным образом выдает: "Сервер MySQL 2006 исчез" Я попытался поместить некоторые вещи в ловушку исключения для повторного подключения к серверу mysql, например:
}catch (\Exception $e){
if(!mysql_ping()){//tried
$this->connection->reconnect(); //also tried
$this->Company->getDatasource()->reconnect(); neither seem to work.
}}
Любые предложения, как подключиться к БД?
1 ответ
У меня была похожая проблема, когда оболочка работает в бесконечном цикле.
Добавьте использование для ConnectionManager:
use Cake\Datasource\ConnectionManager;
Получите соединение до цикла:
$connection = ConnectionManager::get('default');
В цикле, незадолго до того, как вам сначала понадобится соединение, проверьте, все ли еще соединение, и выполните соединение, если вы отключены:
if(!$connection->isConnected()) {
$connection->connect();
}
Если ваша оболочка находится в состоянии ожидания более длительного времени, вы можете попытаться вручную отключиться и выполнить новое подключение, когда вам снова понадобится подключение:
if($connection->isConnected()) {
$connection->disconnect();
}