我打算在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”问题(如果我不使用持久连接),另一方面是“排队查询”问题(如果我使用持久连接)。
答案 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