2014-09-06 59 views
1

我计划通过包括在每一个数据库处理程序脚本的顶部下面的代码使用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应用程序将使用只用一个连接即使有10,000个并发用户,mysql服务器也不会显示“太多连接”错误。但是,由于任何脚本(或同一脚本的不同实例)都将只有一个用于所有数据库调用的mysql持久连接,所以SQL查询将排队,而不是被数千个并行mysql连接处理。

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

+0

“查询排队”完全没有问题。 – 2014-09-06 19:03:44

+0

但为什么呢?是否即使我创建1000个mysql连接并请求1000个并行查询,MySQL会一次处理一个查询? – iamlegend 2014-09-06 19:06:01

+0

如果您有一个持久连接,则只有一个连接并请求1000个并行查询。 MySQL将始终从请求的进程返回请求查询的结果(是的,对于每个访问者都有一个webserver/php进程)。 – 2014-09-06 19:13:34

回答

1

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

show variables like "max_connections"; 

我的是500你可以改变它:

set global max_connections = 1000; 

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

至于您的持久连接,当数据库服务器位于另一台机器和网络上而不是PHP-web服务器时,这非常有用。如果不是,连接时间可能可以忽略不计,在这种情况下,永久连接确实没有优势。还有创建太多持久连接的危险,特别是在Apache服务器上。如果您开始使用持久连接,请观察像鹰一样的连接数量。另外检查wait_timeout变量:

SHOW VARIABLES LIKE "wait_timeout"; 

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

为了保持简短;在MySQL/PHP中,1000个“并行”查询或1000个“并行”连接通常没有太大区别。 最后,所有查询都需要处理,并且您的服务器要么完成任务,要么完成任务。租一个更好的服务器可能是我能给的最好的建议。

MySQL并没有这么做。借助特殊工具和大量工作,您可以让它做出令人惊叹的事情。例如:http://shardquery.com

+0

好的,点了。 1000个连接或1个持久连接的性能大致相同(非持久连接中的连接开销除外)。但我不明白这一部分“还有创造太多持久连接的危险”。为什么这样?如果我在每个脚本的顶部都包含相同的持久连接脚本,我应该始终为整个php应用程序使用一个持久连接。什么时候会出现“太多持续连接”的问题? – iamlegend 2014-09-07 08:41:09

+0

在一个完美的世界中,你会是对的;每个PHP脚本都会选择你的单个持久连接,并且一切都会好的。这不是在实践中发生的事情。例如,如果您在CGI模式下使用PHP,为每个PHP请求启动一个新进程,则永久连接将不会被重用。或者阅读下面的内容:http://stackoverflow.com/questions/3332074/what-are-the-disadvantages-of-using-persistent-connection-in-pdo这里讨论的是PDO,而不是MySQLi,但大部分都适用。 – 2014-09-07 09:30:01

+0

我正在工作的网络初创公司的Web用户数量从平日的5000人增加到了周末的10,000人。这个星期六的流量很高,我们间歇性地开始出现“连接太多”的错误。我们的CTO通过简单地增加数据库服务器上的max_connections值来解决这个问题。我想知道如果使用一个持久连接是一个更好的解决方案吗?我们使用的是Apache + mod_php,而不是CGI。 – iamlegend 2014-09-07 11:39:17