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

时间:2014-09-06 18:48:13

标签: php mysql mysqli

我打算在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服务器的单个连接,因此即使有10,000个并发用户,我的应用程序也永远不会显示“Too many connections”错误。但是,由于任何脚本(或同一脚本的不同实例)的所有数据库调用只有一个mysql持久连接,因此SQL查询将排队,而不是由数千个并行mysql连接处理。

首先,如果我不正确理解,请纠正我。其次,如果我是对的,我该如何解决这个问题。一方面是“Too many connections”问题(如果我不使用持久连接),另一方面是“排队查询”问题(如果我使用持久连接)。

1 个答案:

答案 0 :(得分:1)

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

show variables like "max_connections";

我的是500.您可以使用以下命令进行更改:

set global max_connections = 1000;

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

对于持久连接,当数据库服务器位于另一台机器和网络而不是PHP-webserver时,这非常有用。如果不是,则连接时间可以忽略不计,在这种情况下,持久连接实际上没有优势。还存在创建过多持久连接的危险,尤其是对于Apache服务器。如果您开始使用持久连接,请观察鹰派之类的连接数。另请检查wait_timeout变量:

SHOW VARIABLES LIKE "wait_timeout";

如果太大,请将它缩小。确保正确配置服务器以处理持久连接。

保持简短;在MySQL / PHP中,1000个“并行”查询或1000个“并行”连接之间通常没有太大区别。 最后需要处理所有查询,您的服务器是否可以胜任任务。租用更好的服务器可能是我能给出的最佳建议。

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