php - 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 个活动连接的实例。
我的问题是我们在实现持久连接时是否遗漏了什么?为什么它没有按我们预期的方式工作?提前致谢!
解决方案
您必须确保您的 connection.php 是单例。如果没有,每次与数据库建立连接时,都会使用 php.ini 中定义的参数创建一个新的 mysqli 连接。
推荐阅读
- react-native - 默认编译 sdk eroor
- android - 错误:程序类型已存在:com.google.firebase.analytics.FirebaseAnalytics$Event
- validation - 验证逻辑 - 微服务客户端
- javascript - 为什么 Javascript 文本编辑器 WidgEditor 不提交任何值?
- jdbc - 版本兼容性 og ojdbc6 ojbdbc14 和 jdbc 版本
- r - 如何在 for 循环中包含一个间隔以防止“请求过多”错误(+ 2 个小问题)?
- fusionauth - 创建和获取自定义角色并将其分配给用户
- c - 我可以在不手动复制整个矩阵的情况下更改指针的地址吗?
- openrefine - 如何在 OpenRefine ReST-API 的“创建项目”Post Rquest 中传递选项 JSON?
- angular7 - Angular 7 - 多个插座:错误:无法激活已激活的插座