首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP MySQL连接持久性

问PHP MySQL连接持久性
EN

Stack Overflow用户
提问于 2012-08-02 00:50:20
回答 2查看 9.5K关注 0票数 7

我读过很多关于PHP和MySQL之间的持久数据库连接(mysql_connect与mysql_pconnect)的文章。PDO和MySQLi也是如此。这肯定是我对这个问题缺乏理解,但是如何在网页之间保持数据库连接呢?在此代码中:

代码语言:javascript
复制
$conn = mysql_pconnect( $server , $user, $pass );
mysql_select_db( $dbname );

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

代码语言:javascript
复制
$conn = mysql_connect( $server , $user, $pass );

会建立两个连接。

如果pconnect重用了第一个用户打开的连接,那么第二个用户可以使用mysql_select_db调用吗?

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

希望这是有意义的。我们可以使用MySQL,MySQLi或PDO,只需要知道如何以最好的方式实现这一点,而不会有客户意外地将数据写入他人数据库的可能性!提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-02 01:03:29

从我阅读的文档和评论中,我看到:

mysql_pconnect上的文档(不推荐使用的方法)

其次,当脚本执行结束时,与SQL server的连接不会关闭。相反,链接将保持打开状态以供将来使用( mysql_close()不会关闭由mysql_pconnect()建立的链接)。

并在该页面上发表评论

持久连接适用于由fastCGI管理的CGI PHP,与上面的建议相反,即它们只适用于模块版本。这是因为fastCGI使进程在请求之间运行。在这种模式下的持久连接也很容易不受连接限制的影响,因为你可以设置PHP_FCGI_CHILDREN <<的max_connections <<< Apache的MaxClients。这也节省了资源。

mysqli_connect上的文档(新方法)

通过p添加

前缀:打开一个持久连接。在从连接池打开的连接上自动调用mysqli_change_user()。

Mysqli_change_user文档:

更改指定数据库连接的用户并设置当前数据库。

因此,我的理解如下: pconnect在脚本结束后保持连接打开,但是当一个进程(或者可能是一组进程)仍然活动时(就像在设置了FCGI的服务器中)。一次只有一个脚本使用一个连接,当一个新脚本获取该连接时,用户和数据库就会更新。

因此,如果您使用FCGI和持久连接,则可以减少打开的数据库连接的数量,但同时运行的脚本将不会共享相同的连接。连接对于选择哪个数据库是没有问题的。

票数 6
EN

Stack Overflow用户

发布于 2012-08-02 01:10:08

持久化是通过嵌入到PHP服务器中的PHP副本来完成的。通常你是对的-如果PHP在CGI模式下运行,就不可能有持久连接,因为当请求完成并关闭PHP时,就没有什么可持久的了。

但是,由于PHP服务器中嵌入了PHP的副本,并且PHP服务器本身在请求之间保持运行,因此可以在该“永久”PHP中维护一个持久连接池。

但是,请注意,在Apache多工作者类型的服务器模型上,连接池是按每个子节点进行维护的。如果将池限制设置为10,那么每个Apache子级将有10个连接。20个子节点= 200个连接。

持久连接还会导致长期的死锁问题和其他难以调试的问题。请记住-不能保证用户的HTTP请求将由相同的Apache子/mysql连接提供服务。如果脚本在数据库事务中途终止,该事务将不会回滚,因为MySQL看不到HTTP端-它只看到mysql连接仍然打开并假定一切正常。

下一个点击该特定apache/MySQL子/连接组合的用户现在将神奇地结束于该事务的中间,而不会发现该事务是打开的。基本上,它相当于网络上的一个不冲水的马桶--之前用户的所有“垃圾”都还在那里。

对于非持久连接,您可以保证每次连接时都有一个“干净”的环境。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11763929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档