我们有一个使用mysqli用php编写的应用程序,该应用程序在Google App Engine上运行并连接到Google Cloud SQL。我们有一个实例化
的文件connection.php。 $connection = new mysqli(...);
并且此脚本包含在所有需要连接到数据库的脚本中。
我们的流量越来越多,我们开始看到查询排队的问题非常严重,导致MySQL消失了。我们意识到问题是因为我们为传入的每个请求创建了一个新的Active Connection,这很疯狂。我们确实意识到我们需要使用连接池,但是目前我们还没有时间重写整个过程。因此,我们希望使用php mysqli持久连接,直到能够将应用程序重写为Java或可以使用连接池的东西为止。
从理论上讲,在实现持久连接后,我们应该在Cloud SQL中获得与App Engine中的实例一样多的活动连接(文档中说一个进程中共享一个持久连接)。这是使用持久连接的方法:
$connection = new mysqli('p:localhost',...)
在我们的php.ini中:
mysqli.allow_persistent = "1"
mysqli.max_persistent = "-1"
mysqli.max_links = "-1"
但是,我们看到每次收到新请求时,仍会在Cloud SQL中创建一个新的Active Connection。更糟糕的是,这些连接没有关闭,查询排队的速度更快。我们看到8个实例有时具有40个活动连接。
我的问题是,实现持久连接时我们会丢失一些东西吗?为什么不按我们预期的方式工作?预先感谢!
答案 0 :(得分:1)
您必须确保您的connection.php是Singleton。如果没有,则每次建立与数据库的连接时,都会使用php.ini中定义的参数创建一个新的mysqli连接。