В это в части руководства Mysql-nd описывается, как реализовать рекомендуемый способ аварийного переключения при потере соединения с подчиненным сервером MySQL.
Я готов реализовать это в PhalconPHP. Поскольку у меня есть несколько важных проектов, использующих Phalcon и Mysql-nd, для меня очень важно сделать это в нужном месте.
Пытаюсь найти документацию, но не могу найти ни одного примера, с которого можно было бы даже начать. Пытался найти подход EventManager, просматривая документацию Phalcon здесь и здесь, но не могу найти способ сделать это прозрачно.
Наиболее привлекательным способом было бы использование менеджера событий для захвата события ошибки и запросите то же самое снова, если ошибка соединения.
1 ОБНОВЛЕНИЕ
Прочитав некоторые источники Phalcon, я обнаружил, что может быть невозможно запустить один и тот же запрос во второй раз стандартным способом - я имею в виду здесь через какой-то параметр PDO или с помощью Phalcons EventManager
, прикрепленного к db
сервису. Одна возможная попытка, которую я нашел, - фактически запустить любой запрос после события db:afterConnection
, но это не решение.
2 ОБНОВЛЕНИЕ
db:afterConnection
труднодоступен, зато можно собрать все во время db:beforeQuery
. Проблема в том, что PDO запускается Phalcon с PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
, поэтому, когда соединение с подчиненным обрывается, он не может достичь события db:afterConnection
. Можно получить экземпляр PDO во время db:beforeQuery
и изменить этот атрибут через EventManager
, но это ничего не даст, потому что даже если я смогу отправить тот же запрос во второй раз, я не могу найти способ вернуть его в нужном месте (не могу переопределить результат запроса во время db:afterQuery
) потому что полученный оператор не является частью отправки события, а результат Eventmanager вообще не используется:
if typeof statement == "object" {
if typeof eventsManager == "object" {
eventsManager->fire("db:afterQuery", this, bindParams);
}
return new ResultPdo(this, statement, sqlStatement, bindParams, bindTypes);
}