PHP MySQL连接持久性

PHP MySQL连接持久性,php,mysql,persistence,Php,Mysql,Persistence,我读过很多关于PHP和MySQL之间的持久数据库连接MySQL\u connect与MySQL\u pcConnect的文章。PDO和MySQLi也是如此。这肯定是因为我对这一点缺乏了解,但网页之间的数据库连接如何能够持久?在此代码中: $conn = mysql_pconnect( $server , $user, $pass ); mysql_select_db( $dbname ); 如果两个用户同时加载这个页面,使用两个不同的$dbname变量,PHP会只与数据库建立一个或两个连接吗?

我读过很多关于PHP和MySQL之间的持久数据库连接MySQL\u connect与MySQL\u pcConnect的文章。PDO和MySQLi也是如此。这肯定是因为我对这一点缺乏了解,但网页之间的数据库连接如何能够持久?在此代码中:

$conn = mysql_pconnect( $server , $user, $pass );
mysql_select_db( $dbname );
如果两个用户同时加载这个页面,使用两个不同的$dbname变量,PHP会只与数据库建立一个或两个连接吗?我相当肯定

$conn = mysql_connect( $server , $user, $pass );
将建立两个连接

如果pconnect重用第一个用户打开的连接,mysql\u select\u db调用是否对第二个用户有效

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


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

通过阅读文档和评论,我看到:

mysql\u pconnect上的文档不推荐使用的方法

其次,当脚本执行结束时,与SQL server的连接不会关闭。相反,该链接将保持开放供将来使用mysql\u close不会关闭mysql\u pconnect建立的链接

并在该页面上发表评论


持久性连接适用于fastCGI管理的CGI PHP,与上面的建议相反,它们只适用于模块版本。这是因为fastCGI使PHP进程在请求之间运行。这种模式下的持久连接也很容易不受连接限制的影响,因为您可以设置PHP_FCGI_CHILDREN持久性是通过嵌入web服务器中的PHP副本完成的。通常你是对的——如果PHP是在CGI模式下运行的,就不可能有一个持久的连接,因为当请求完成并且PHP关闭时,就没有什么可以持久的了

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

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

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

下一个用户,特定的Apache /MySQL子/连接组合现在将神奇地结束在该事务的中间,没有线索表明事务是打开的。基本上,它相当于一个没有清洗过的厕所——以前用户的所有垃圾都还在那里


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

所选数据库是一个麻烦,您应该在每个脚本的开头选择数据库,这样可以避免问题。就个人而言,我认为持久性连接本身在DB优化方面是一个危险因素——它们没有以任何有意义的方式减少并发连接的数量,只是减少了连接操作的数量。如果我是你,我会花你的时间优化查询,而不是担心连接的机制。不要使用mysql函数,它们已被弃用,你可以使用mysqli或PDO。PDO是更好的方式,不推荐的方式不使用。因此,文章描述了您的问题:那么@Marc,我们不应该使用pconnect,因为这不处理边缘情况。我们不能假设所有的流程都会顺利结束。不是吗?