Почему PHP PDO подключается к другой базе данных при использовании постоянного подключения? - PullRequest
0 голосов
/ 19 мая 2018

Я подключаюсь к MySQL, используя PDO PHP следующим образом:

$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-й раз эта проблема возникает.

Я бы никогда не ожидал, что это случится.Это дало мне сильную головную боль .Кто-нибудь может это объяснить?И единственное ли решение не использовать постоянство?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018
$driver_options[PDO::ATTR_PERSISTENT] = true;
$db = new PDO('mysql:host='.$host.';dbname='.$db_name, $user, $pass,    $driver_options);

Когда вы делаете выше, соединение PDO помещается в «пул постоянных соединений», но цель пула состоит не в кэшировании базы данных , а в выделении памяти, аутентификации иподготовить фундамент. То, что - это то, что использует время (не так уж много).

Все, что вы предоставляете в вызове new PDO(), равно LOST .

И если у вас есть две базы данных с одинаковыми учетными данными, вы можете заменить их случайным образом - как вы уже видели.

Итак, не не указывает БД в операторе new PDO, но используйте оператор SQL USE databasename, как только новый объект PDO будет готов.

Или, как рекомендует PankajKumar, установите разные учетные данные для двух БД.Тогда ошибочное попадание в кэш не произойдет (но, как правило, повторяется, как только кто-то повторно использует те же учетные данные, такие как 'ubuntu / ubuntu' или 'root /').

0 голосов
/ 29 мая 2018

Полагаю, вы работаете с этим в производственной среде или система разработки, которая загружается не так часто.

Поэтому, пожалуйста, перезапустите все ваши работники / экземпляры / потоки php и проверьте, не возникает ли проблема снова.

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

0 голосов
/ 28 мая 2018

PDO :: ATTR_PERSISTENT поддерживается частично и зависит от версии PHP и сервера SQL, который вы используете.Я бы порекомендовал никогда не устанавливать для этого атрибута значение true в параметрах дисковода из-за его нестабильности.

Мне удалось воспроизвести ваш случай, и я обнаружил, что слой пула соединений ODBC кэширует соединение, и поскольку ваше соединение устанавливаетсяустановлен постоянный, кэш сбрасывался каждый раз, когда я устанавливал новое соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...