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

时间:2018-05-19 15:07:57

标签: 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);

我在这台服务器上有2个数据库(让他们称之为database_A和database_B),有时会发生非常奇怪的事情。即使$ db_name 100%设置为' database_A',也会连接到' database_B'。

它完全随机发生。我可以再次运行相同的脚本10次,一切都很好。第11次发生这个问题。

我绝不会指望这种情况发生。它给了我a lot of headache。有人能解释一下吗?并且是不使用持久性的唯一解决方案吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

$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语句中指定数据库,但在新的PDO对象准备好后立即使用USE databasename SQL语句。

或者,正如PankajKumar建议的那样,为两个DB设置不同的凭据。然后错误的缓存命中将不会发生(但是一旦有人重复使用那些相同的凭证,就会再次发生 - 例如'ubuntu / ubuntu'或'root /')。

答案 2 :(得分:0)

我想你是在生产中运行它,或者是不经常重新加载的开发系统。

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

我相信其中一个进程正在保留您的旧配置。当您的网络服务器实际选择使用旧的东西时,随机地默默地导致您的错误。