我使用php的pdo连接到mysql,如下所示:
$driver_options[PDO::ATTR_PERSISTENT] = true;
$db = new PDO('mysql:host='.$host.';dbname='.$db_name, $user, $pass, $driver_options);
我在这个服务器上有两个数据库(我们称它们为数据库a和数据库b),有时会发生非常奇怪的事情。即使,$db\u name 100%设置为“database\u a”,也会连接到“database\u b”。
这完全是随机发生的。我可以运行相同的脚本10次了,一切都很好。第11次出现这个问题。
我从没想过会发生这种事。它使我很头痛。有人能解释一下吗?唯一不使用持久性的解决方案是什么?
3条答案
按热度按时间ni65a41a1#
我想您是在生产环境中运行这个程序,或者是在一个不经常重新加载的开发系统中运行这个程序。
因此,请重新启动所有php worker/instances/threads并检查问题是否再次发生。
我相信其中一个过程是保持您的旧配置。当您的Web服务器实际选择使用旧的东西时,会导致您的错误。
wgeznvg72#
当您执行上述操作时,pdo连接被放置在“持久连接池”中,但池的目的不是缓存数据库,而是内存分配、身份验证和设置基础。这就是利用时间的原因(在那一点上,不是那么多)。
你在市场上还供应什么
new PDO()
呼叫丢失。如果您有两个具有相同凭据的数据库,您可以随意交换它们--就像您所经历的那样。
所以,不要在
new PDO
声明,但使用USE databasename
新pdo对象准备就绪后立即执行sql语句。或者,正如pankajkumar所建议的,为两个数据库设置不同的凭证。这样错误的缓存命中就不会发生了(但一旦有人重用了那些相同的凭据,比如“ubuntu/ubuntu”或“root/”,这种情况就不会再发生了)。
slhcrj9b3#
部分支持pdo::attrèu persistent,它依赖于您使用的php版本和sql服务器。我建议不要在驱动器选项中将此属性设置为true,因为它不稳定。
我可以复制你的案例,我发现odbc连接池层正在缓存连接,由于你的连接被设置为持久性,所以每次我建立新连接时缓存都会被重置。