Почему PHP PDO подключается к другой базе данных при использовании постоянного соединения?
Я подключаюсь к MySQL с помощью PHP PDO следующим образом:
$driver_options[PDO::ATTR_PERSISTENT] = true;
$db = new PDO('mysql:host='.$host.';dbname='.$db_name, $user, $pass, $driver_options);
У меня есть 2 базы данных (назовите их database_A и database_B) на этом сервере, и иногда бывает очень странно. Несмотря на то, что $ db_name на 100% установлено в 'database_A', соединение выполняется с 'database_B'.
Это происходит совершенно случайно. Я могу запустить тот же скрипт 10 раз снова, и все в порядке. И в 11 раз эта проблема возникает.
Я бы никогда не ожидал, что это произойдет. Это дало мне большую головную боль. Может ли кто-нибудь объяснить это? И это единственное решение не использовать упорство?
Ответы
Ответ 1
PDO :: ATTR_PERSISTENT частично поддерживается и зависит от версии PHP и SQL-сервера, который вы используете. Я бы рекомендовал никогда не устанавливать этот атрибут в true в параметрах диска из-за его нестабильности.
Я смог реплицировать ваше дело, и я обнаружил, что уровень соединения ODBC Connection Pooling кэширует соединение, и поскольку ваше соединение настроено на постоянное, кеш сбрасывается каждый раз, когда я создал новое соединение.
Ответ 2
$driver_options[PDO::ATTR_PERSISTENT] = true;
$db = new PDO('mysql:host='.$host.';dbname='.$db_name, $user, $pass, $driver_options);
Когда вы делаете это, соединение PDO помещается в "постоянный пул соединений", но цель пула заключается не в кэшировании базы данных, а в распределении памяти, аутентификации и настройки. Это то, что использует время (не так много, при этом).
Что бы вы ни предложили в new PDO()
вызове new PDO()
LOST.
И если у вас есть две базы данных с одинаковыми учетными данными, вы можете заставить их поменять местами случайным образом - как вы это пережили.
Таким образом, не указывайте БД в new PDO
заявлении new PDO
, но используйте инструкцию SQL- USE databasename
как только новый объект PDO будет готов.
Или, как предлагает PankajKumar, настроить разные учетные данные для двух БД. Тогда ошибочного попадания в кеш не произойдет (но скорее повторится, как только кто-то повторит те же самые полномочия - например, "ubuntu/ubuntu" или "root/").
Ответ 3
Я полагаю, вы используете это в производстве или систему dev, которая перезагружается не так часто.
Поэтому перезагрузите все ваши php-работники/экземпляры/потоки и проверьте, не возникла ли проблема снова.
Я считаю, что один из этих процессов содержит вашу старую конфигурацию. И тихо вызывает ваши ошибки, случайным образом, когда ваш веб-сервер на самом деле предпочитает использовать старую вещь.