PHP MySQL连接持久性

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

我读过很多关于PHP和MySQL之间的持久数据库连接的文章(MySQL\u connect和MySQL\u pconnect)。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_pconnect上的文档(不推荐的方法)

其次,当脚本执行结束时,与SQL server的连接不会关闭。相反,该链接将保持打开状态以供将来使用(mysql_close()不会关闭由mysql_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方面的东西——它所看到的只是MySQLPACHE连接仍然打开,并且假设一切正常

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


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

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