我已经阅读了很多关于PHP和MySQL之间持久数据库连接的信息(mysql_connect与mysql_pconnect)。与PDO和MySQLi相同。这肯定只是我对这个缺乏了解,但是如何在网页之间保持数据库连接?在这段代码中:
$conn = mysql_pconnect( $server , $user, $pass );
mysql_select_db( $dbname );
如果两个用户同时加载此页面,使用两个不同的$ dbname变量,PHP只会与数据库建立一个连接,还是两个?我很确定
$conn = mysql_connect( $server , $user, $pass );
将建立两个连接。
如果pconnect重用第一个用户打开的连接,mysql_select_db调用是否适用于第二个用户?
理想情况下,我正在寻找的是一种减少数据库连接但仍能在每个PHP脚本中设置默认数据库的方法。我有客户都使用相同的PHP脚本,但数据存储在他们自己的客户端数据库中(因此,$ dbname总是不同,但MySQL连接参数是相同的 - 相同的mysql IP地址,用户和密码)。 / p>
希望这是有道理的。我们可以使用MySQL,MySQLi或PDO,只需知道如何以最佳方式实现这一点,而不会让客户意外地将数据写入别人的数据库!提前谢谢。
答案 0 :(得分:7)
持久性由嵌入在Web服务器中的PHP副本完成。通常你是对的 - 如果PHP在CGI模式下运行,就不可能有持久连接,因为当请求完成并且PHP关闭时,没有任何东西可以保留。
但是,由于Web服务器中嵌入了PHP副本,并且Web服务器本身在请求之间保持运行,因此可以在“永久”PHP中维护一个持久连接池。
但是,请注意,在Apache多工作类型服务器模型上,连接池保持PER-CHILD。如果将池限制设置为10,则每个Apache子项将有10个连接。 20个孩子= 200个连接。
持久连接还会导致死锁和其他难以调试的问题的长期问题。请记住 - 无法保证SAME apache child / mysql连接将为用户的HTTP请求提供服务。如果一个脚本在数据库事务中途中断,该事务将 NOT 回滚,因为MySQL没有看到HTTP方面的东西 - 它看到的只是mysql< - > apache连接仍然是开放的并且假设一切顺利。
命中该特定apache / mysql子/连接组合的下一个用户现在将神奇地在该事务的中间结束,并且不知道该事务是否已打开。基本上,它是网络相当于一个没有刷新的厕所 - 来自前一个用户的所有“垃圾”仍然存在。
使用非持久性连接,每次连接时都可以保证“干净”的环境。
答案 1 :(得分:6)
通过阅读文档和评论,我看到了:
关于mysql_pconnect的文档(不建议使用的方法)
其次,当脚本的执行结束时,不会关闭与SQL服务器的连接。相反,链接将保持打开以供将来使用(mysql_close()不会关闭mysql_pconnect()建立的链接。)
并对该页面发表评论
持久连接适用于由fastCGI管理的CGI PHP,与上面的建议相反,它们仅适用于模块版本。这是因为fastCGI使PHP进程在请求之间运行。此模式下的持久连接也很容易受到连接限制的影响,因为您可以设置PHP_FCGI_CHILDREN<< mysql的max_connections<<< Apache的MaxClients。这也节省了资源。
关于mysqli_connect的文档(新方法)
通过p:预先添加主机打开持久连接。在从连接池打开的连接上自动调用mysqli_change_user()。
mysqli_change_user的文档:
更改指定数据库连接的用户并设置当前数据库。
所以我的理解如下:pconnect在脚本结束后保持连接打开但是进程(或者可能是进程组)仍处于活动状态(例如在设置了FCGI的服务器中)。一次只有一个脚本使用连接,当新脚本获取该连接时,用户和数据库将更新。
因此,如果使用FCGI和持久连接,则可以减少打开的数据库连接数,但同时运行的脚本将不会共享同一连接。关于选择哪个数据库,连接没有问题。