mysqli中的持久连接是如何工作的


How does persistent connection in mysqli work?

我计划在mysqli中使用持久连接,在每个数据库处理程序脚本的顶部包含以下代码:

$db = new mysqli('p:localhost', 'db_user', 'db_user_pass', 'db_name');
if($db->connect_errno > 0){
    die('Unable to connect to database [' . $db->connect_error . ']');
} 

我在这里看到的优势是,我的web应用程序将只使用与mysql服务器的单一连接,因此即使同时有10000个用户,我的应用程序也不会显示"连接太多"错误。然而,由于任何脚本(或同一脚本的不同实例)的所有数据库调用都只有一个mysql持久连接,SQL查询将排队,而不是由数千个并行mysql连接处理。

首先,如果我理解不正确,请纠正我。第二,如果我是对的,我该如何解决这个问题。一方面是"连接太多"的问题(如果我不使用持久连接),另一方面则是"查询排队"的问题。

要解决"连接太多"的问题,可以很快将MySQL变量max_connections设置得更高。如果使用phpMyAdmin,则可以使用以下SQL命令查看最大连接量:

show variables like "max_connections";

我的是500。您可以使用进行更改

set global max_connections = 1000;

但你需要超级特权。之后,我会检查您的脚本是否及时关闭所有连接。查看phpMyAdmin中的流程。有什么东西在那里停留几秒钟以上吗?

至于持久连接,当数据库服务器位于PHP Web服务器之外的另一台机器和网络上时,这很有用。如果不是,连接时间可能可以忽略不计,在这种情况下,持久连接实际上没有任何好处。还有创建过多持久连接的危险,尤其是使用Apache服务器。如果您开始使用持久连接,请像鹰一样观察连接的数量。同时检查wait_timeout变量:

SHOW VARIABLES LIKE "wait_timeout";

如果它太大,就把它缩小很多。请确保您的服务器配置正确,以处理持久连接。

保持简短;在MySQL/PHP中,1000个"并行"查询和1000个"平行"连接之间通常没有太大区别最终,所有的查询都需要处理,而您的服务器要么能胜任任务,要么不能胜任任务租一台更好的服务器可能是我能给出的最好建议。

MySQL并没有做那么多并行的工作。有了特殊的工具和大量的工作,你可以让它做出惊人的事情。例如:http://shardquery.com