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

Php mysqli中的持久连接是如何工作的?,php,mysql,mysqli,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应用程序将只

我计划在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\u connections
设置得更高。如果使用
phpMyAdmin
可以使用以下SQL命令查看最大连接数:

show variables like "max_connections";
我的是500。您可以通过以下方式进行更改:

set global max_connections = 1000;
但您需要超级特权才能完成此操作。之后,我会检查您的脚本是否及时关闭所有连接。查看
phpMyAdmin
中的流程。有什么东西在那里停留了几秒钟以上吗

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

SHOW VARIABLES LIKE "wait_timeout";
如果它太大,就把它弄小一点。确保服务器已正确配置以处理持久连接

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


MySQL只是没有并行地做那么多。有了特殊的工具和大量的工作,你可以让它做一些令人惊奇的事情。例如:

查询排队完全没有问题。但为什么会这样呢?是不是即使我创建1000个mysql连接并并行请求1000个select查询,mysql也会一次处理一个查询?如果你有一个持久连接,你将只有一个连接并并行请求1000个查询。MySQL将始终从其请求的进程返回请求查询的结果(是的,对于每个访问者都有一个webserver/php进程)。好的,我想问的是:(场景1)->1000个并行查询,1000个并行连接,每个查询1ms:总时间:1ms(场景2)->1000个并行查询,1个持久连接,每次查询1ms:总时间:1000ms(问题)->场景2如何/何时更好?好的,重点是。1000个连接或1个持久性连接的性能大致相同(非持久性连接的连接开销除外)。但我不理解这一部分“也存在创建太多持久连接的危险”。为什么会这样?如果我在每个脚本之上都包含相同的持久连接脚本,那么对于整个php应用程序,我应该始终只使用一个持久连接。什么时候会出现“太多持续连接”的问题?在一个完美的世界里,你是对的;每一个PHP脚本都会选择一个持久连接,一切都会很好。事实并非如此。例如,如果您在CGI模式下使用PHP,为每个PHP请求启动一个新进程,那么持久连接就不会被重用。或者读一下:这篇文章讲的是PDO,不是MySQLi,但大部分都适用。我所在的这家网络初创公司的并发网络用户数量激增,从正常一天的5000人增加到周末的10000人。本周六的流量如此之高,我们开始间歇性地出现“连接太多”错误。我们的CTO通过简单地增加DB服务器上的max_connections值来解决这个问题。我想知道在这里使用一个持久连接是否是更好的解决方案?我们使用的是apache+mod_php,而不是CGI。这是大量并发连接。这超出了我的经验。也许,如果你像现在一样重新表述你的问题,会有更多的人回答?告诉他们你现在使用什么类型的主机,你真正的问题是什么,你尝试了什么。然后总是有云托管,比如基础设施已经准备好迎接攻击。我就到此为止,我没有更多的贡献了。谢谢!我花了很长时间才得出这个问题。我在发布一个新问题。顺便说一下,我们已经将AWS与多个DB和WebApp服务器一起使用了!