首页 > 解决方案 > php mysqli 持久连接未在 App Engine 中共享

问题描述

我们有一个用 php 编写的应用程序,它使用在 Google App Engine 上运行的 mysqli 并连接到 Google Cloud SQL。我们有一个文件 connection.php 实例化

$connection = new mysqli(...);

这个脚本包含在所有需要连接数据库的脚本中。

我们的流量越来越多,我们开始看到查询排队的问题非常严重,导致 MySQL has gone away 错误。我们意识到问题是因为我们为每个进来的请求创建了一个新的活动连接,这太疯狂了。我们确实意识到我们需要使用连接池,但此时我们没有时间重写整个事情。所以我们想使用 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 个活动连接的实例。

我的问题是我们在实现持久连接时是否遗漏了什么?为什么它没有按我们预期的方式工作?提前致谢!

标签: phpgoogle-app-enginemysqligoogle-cloud-sqlpersistent-connection

解决方案


您必须确保您的 connection.php 是单例。如果没有,每次与数据库建立连接时,都会使用 php.ini 中定义的参数创建一个新的 mysqli 连接。


推荐阅读