php mysqli 持久连接未在 App Engine 中共享
php mysqli persistent connection not being shared in App Engine
我们有一个用 php 编写的应用程序,在 Google App Engine 上使用 mysqli 运行 并连接到 Google Cloud SQL。我们有一个实例化
的文件 connection.php
$connection = new mysqli(...);
并且这个脚本包含在所有需要连接数据库的脚本中。
我们的流量越来越大,我们开始发现查询排队问题非常严重,导致 MySQL has gone away 错误。我们意识到问题是因为我们为每个传入的请求创建了一个新的活动连接,这太疯狂了。我们确实意识到我们需要使用连接池,但此时我们没有时间重写整个事情。所以我们想使用 php mysqli 持久连接,直到我们能够将应用程序重写为 Java 或可以使用连接池的东西。
理论上,随着持久连接的实施,我们应该在云中获得与 App Engine 中的实例一样多的活动连接 SQL(文档说一个持久连接在一个进程中共享)。这是如何使用持久连接:
$connection = new mysqli('p:localhost',...)
在我们的 php.ini 中:
mysqli.allow_persistent = "1"
mysqli.max_persistent = "-1"
mysqli.max_links = "-1"
但是,我们看到每次有新的请求进来时,Cloud 中仍然会创建一个新的 Active Connection SQL。更糟糕的是,这些连接没有关闭,查询排队的速度更快。我们有时会看到 8 个实例有 40 个活动连接。
我的问题是我们在实现持久连接时是否遗漏了什么?为什么它没有按照我们预期的方式工作?提前致谢!
您必须确保您的 connection.php 是单身人士。如果没有,每次建立到数据库的连接时,将使用 php.ini.
中定义的参数创建一个新的 mysqli 连接
我们有一个用 php 编写的应用程序,在 Google App Engine 上使用 mysqli 运行 并连接到 Google Cloud SQL。我们有一个实例化
的文件 connection.php$connection = new mysqli(...);
并且这个脚本包含在所有需要连接数据库的脚本中。
我们的流量越来越大,我们开始发现查询排队问题非常严重,导致 MySQL has gone away 错误。我们意识到问题是因为我们为每个传入的请求创建了一个新的活动连接,这太疯狂了。我们确实意识到我们需要使用连接池,但此时我们没有时间重写整个事情。所以我们想使用 php mysqli 持久连接,直到我们能够将应用程序重写为 Java 或可以使用连接池的东西。
理论上,随着持久连接的实施,我们应该在云中获得与 App Engine 中的实例一样多的活动连接 SQL(文档说一个持久连接在一个进程中共享)。这是如何使用持久连接:
$connection = new mysqli('p:localhost',...)
在我们的 php.ini 中:
mysqli.allow_persistent = "1"
mysqli.max_persistent = "-1"
mysqli.max_links = "-1"
但是,我们看到每次有新的请求进来时,Cloud 中仍然会创建一个新的 Active Connection SQL。更糟糕的是,这些连接没有关闭,查询排队的速度更快。我们有时会看到 8 个实例有 40 个活动连接。
我的问题是我们在实现持久连接时是否遗漏了什么?为什么它没有按照我们预期的方式工作?提前致谢!
您必须确保您的 connection.php 是单身人士。如果没有,每次建立到数据库的连接时,将使用 php.ini.
中定义的参数创建一个新的 mysqli 连接