PHP MySQL连接持久性

Jon*_*hon 7 php mysql persistence

我已经读过很多关于PHP和MySQL之间持久数据库连接的信息(mysql_connect与mysql_pconnect).与PDO和MySQLi相同.这肯定只是我对这个缺乏了解,但是如何在网页之间保持数据库连接?在这段代码中:

$conn = mysql_pconnect( $server , $user, $pass );
mysql_select_db( $dbname );
Run Code Online (Sandbox Code Playgroud)

如果两个用户同时加载此页面,使用两个不同的$ dbname变量,PHP是否只与数据库建立一个连接或两个?我相当肯定

$conn = mysql_connect( $server , $user, $pass );
Run Code Online (Sandbox Code Playgroud)

会做两个连接.

如果pconnect重用第一个用户打开的连接,mysql_select_db调用是否适用于第二个用户?

理想情况下,我正在寻找的是一种减少数据库连接但仍能在每个PHP脚本中设置默认数据库的方法.我有客户都使用相同的PHP脚本,但数据存储在他们自己的客户端数据库中(因此,$ dbname总是不同,但MySQL连接参数是相同的 - 相同的mysql IP地址,用户和密码).

希望有道理.我们可以使用MySQL,MySQLi或PDO,只需知道如何以最佳方式实现这一点,而不会让客户意外地将数据写入别人的数据库!提前致谢.

Mar*_*c B 7

持久性由嵌入在Web服务器中的PHP副本完成.通常你是对的 - 如果PHP在CGI模式下运行,就不可能有持久连接,因为当请求完成并且PHP关闭时,没有任何东西可以保留.

但是,由于Web服务器中嵌入了PHP副本,并且Web服务器本身在请求之间保持运行,因此可以在"永久"PHP中维护持久连接池.

但请注意,在Apache多工作类型服务器模型上,连接池保持PER-CHILD.如果将池限制设置为10,则每个Apache子项将有10个连接.20个孩子= 200个连接.

持久连接还会导致死锁和其他难以调试的问题的长期问题.请记住 - 无法保证SAME apache child/mysql连接将为用户的HTTP请求提供服务.如果脚本在数据库事务中途中断,则该事务将不会回滚,因为MySQL没有看到HTTP方面的事情 - 它看到的只是mysql < - > apache连接仍处于打开状态且假设一切正常.

命中该特定apache/mysql子/连接组合的下一个用户现在神奇地在该事务的中间结束,而不知道事务是否打开.基本上,它是网络相当于一个没有刷新的厕所 - 来自前一个用户的所有"垃圾"仍然存在.

使用非持久连接,每次连接时都可以保证"干净"的环境.


web*_*rgm 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和持久连接,则可以减少打开的数据库连接数,但同时运行的脚本将不会共享同一连接.关于选择哪个数据库,连接没有问题.