【问题标题】:All requests requiring connection to mysql are very very slow (using Phalcon)所有需要连接到 mysql 的请求都非常非常慢(使用 Phalcon)
【发布时间】:2014-03-20 22:55:21
【问题描述】:

我一直致力于将我的应用程序从 CodeIgniter 转换为 Phalcon。我注意到使用 CI 最多只需要 3 或 4 秒的 [查询繁重] 请求使用 Phalcon 最多需要 30 秒才能完成!

我花了几天时间试图找到解决方案。我尝试使用框架提供的所有不同访问方式,包括将原始查询字符串直接提交到 Phalcon 的 MySql PDO 适配器。

我正在将我的数据库连接添加到服务容器,就像在 Phalcon 的 INVO 教程中显示的那样:

$di->set('db', function() use ($config) {
    return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
        "host" => $config->database->host,
        "username" => $config->database->username,
        "password" => $config->database->password,
        "dbname" => $config->database->name
    ));
});

使用 webgrind 输出,我能够将瓶颈缩小到 Phalcon 的 PDO 适配器类中的构造函数(成本以毫秒为单位):

我已经分析并手动测试了相关的 SQL,以确保瓶颈不在数据库中(或者我构造不佳的 SQL!)

【问题讨论】:

    标签: php mysql dependency-injection phalcon


    【解决方案1】:

    在大多数示例中,服务实际上是共享的,但不是以最明显的方式,而是通过:

    $di->set('service', …, true);
    

    传递给集合的最后一个 bool 参数使其共享,并且在 99.9% 的情况下,您希望您的 DI 服务是这种方式,否则会发生类似的事情,如 @the-notable 所述,但因为它们很可能是没有那么“有影响力”,他们很难追查到。

    【讨论】:

      【解决方案2】:

      我发现了这个问题,但对我来说并不是很明显,所以希望其他人也会发现这很有用。

      每次启动新查询时,应用程序都会获取数据库适配器的新实例。产生上述 webgrind 输出的请求共有 20 个查询。

      在重新阅读 Phalcon 关于依赖注入的文档部分时,我看到服务可以选择作为“共享”服务添加到服务容器中,这有效地强制对象充当单例,这意味着一旦类被创建后,应用程序只会将该实例传递给任何请求,而不是创建一个新实例。

      有几种方法可以强制将服务添加为共享服务,详细信息可以在 Phalcon 的文档中找到:

      http://docs.phalconphp.com/en/latest/reference/di.html#shared-services

      将上面发布的代码更改为共享服务如下所示:

      $di->setShared('db', function() use ($config) {
          return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
              "host" => $config->database->host,
              "username" => $config->database->username,
              "password" => $config->database->password,
              "dbname" => $config->database->name
          ));
      });
      

      这是上面引用的相同查询的 webgrind 输出的样子,但在将数据库服务设置为共享服务(以毫秒为单位)添加之后:

      请注意,调用计数现在是 1 而不是 20,调用成本从 20 秒下降到 1 秒!

      我希望其他人觉得这很有用!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 2012-01-03
        • 2012-01-29
        • 2017-02-14
        • 1970-01-01
        相关资源
        最近更新 更多