Почему 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-работники/экземпляры/потоки и проверьте, не возникла ли проблема снова.

Я считаю, что один из этих процессов содержит вашу старую конфигурацию. И тихо вызывает ваши ошибки, случайным образом, когда ваш веб-сервер на самом деле предпочитает использовать старую вещь.