为什么PHP PDO在使用持久连接时连接到不同的数据库?

为什么PHP PDO在使用持久连接时连接到不同的数据库?,php,mysql,pdo,Php,Mysql,Pdo,我使用PHP的PDO连接到MySQL,如下所示: $driver_options[PDO::ATTR_PERSISTENT] = true; $db = new PDO('mysql:host='.$host.';dbname='.$db_name, $user, $pass, $driver_options); 我在这台服务器上有两个数据库(我们称它们为database_A和database_B),有时会发生非常奇怪的事情。即使$db_name 100%设置为“database_A”,也会连

我使用PHP的PDO连接到MySQL,如下所示:

$driver_options[PDO::ATTR_PERSISTENT] = true;
$db = new PDO('mysql:host='.$host.';dbname='.$db_name, $user, $pass, $driver_options);
我在这台服务器上有两个数据库(我们称它们为database_A和database_B),有时会发生非常奇怪的事情。即使$db_name 100%设置为“database_A”,也会连接到“database_B”

这完全是随机发生的。我可以把同一个脚本重复运行10次,一切都很好。第11次出现这种情况


我从来没想过会发生这种事。它给了我。有人能解释一下吗?唯一不使用持久性的解决方案是什么?

PDO::ATTR_PERSISTENT部分受支持,并且取决于您使用的PHP版本和SQL server。 我建议不要在驱动器选项中将此属性设置为true,因为它不稳定

我能够复制您的案例,我发现ODBC连接池层正在缓存连接,并且由于您的连接被设置为持久性,所以每次我建立新连接时缓存都会被重置

$driver_options[PDO::ATTR_PERSISTENT] = true;
$db = new PDO('mysql:host='.$host.';dbname='.$db_name, $user, $pass,    $driver_options);
执行上述操作时,PDO连接被放置在“持久连接池”中,但池的用途不是缓存数据库,而是内存分配、身份验证和设置基础。这就是使用时间的原因(不是那么多)

您在
new PDO()
调用中提供的任何其他内容都将丢失

如果您有两个具有相同凭据的数据库,您可以随意交换它们——正如您所经历的那样

因此,不要在
new PDO
语句中指定DB,而是在新PDO对象准备好后立即使用
use databasename
SQL语句


或者,正如PankajKumar所建议的,为两个DBs设置不同的凭证。这样,错误的缓存命中就不会发生(但一旦有人重用相同的凭据(如“ubuntu/ubuntu”或“root/”),这种情况就不会再次发生)。

我想您是在生产环境中运行这种缓存命中,或者是在开发系统中不经常重新加载

因此,请重新启动所有php Worker/instances/threads,并检查问题是否再次发生


我相信其中一个过程是保留您的旧配置。当您的Web服务器实际选择使用旧的东西时,会导致您的错误

是否可能是您之前为某些测试或类似测试配置了数据库_B?那么这可能是一个缓存问题……不要问我为什么以及如何做,但我曾经听说在
mysql:
hostname
之间放置一个空格,比如
mysql:host
,以解决连接问题。是-->示例4Notes@PeterM不幸的是,这个技巧对我不起作用。请为不同的帐户设置并尝试不同的凭据databases.OP问道。我想他可能使用的技术还不能移植到最新版本。你能提供复制这个bug的步骤吗?