簡體   English   中英

所有需要連接到mysql的請求都非常慢(使用Phalcon)

[英]All requests requiring connection to mysql are very very slow (using Phalcon)

我一直致力於將我的應用程序從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適配器類中的構造函數(成本以毫秒為單位):

webgrind輸出,以毫秒為單位的成本

我已經分析並手動測試了相關的SQL,以確保瓶頸不在數據庫中(或者我的SQL構造不好!)

我發現了這個問題,對我來說並不是很明顯,所以希望其他人也會覺得這個問題很有用。

每次啟動新查詢時,應用程序都會獲得數據庫適配器的新實例。 產生上述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輸出,但是在將數據庫服務設置為共享服務(成本以毫秒為單位)之后:

webgrind輸出,以毫秒為單位的成本

請注意,調用計數現在是1而不是20,調用成本從20秒下降到1秒!

我希望別人覺得這很有用!

在大多數示例中,服務是事實上共享的,但不是以最明顯的方式共享,而是通過:

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

傳遞給集合的最后一個bool參數使它共享,並且在99.9%中你希望你的DI服務是這樣的,否則類似的事情會發生在@the-notable所描述的,但是因為它們可能不是“有影響力的“,他們很難追查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM