2013-01-15 37 views
1

我是CakePHP框架的新手,正在嘗試設置「Hello World」項目。處理它時,執行簡單的數據庫查詢時,CakePHP的響應非常緩慢。執行簡單的數據庫查詢時CakePHP的響應非常慢

下面是我做的步驟:

  1. 下載CakePHP的框架(2.3.0 RC1),並將它設置
  2. 名爲「測試」的空表創建一個「測試」 DB 。
  3. 編輯默認AppController.php文件如下:

    class AppController extends Controller { 
    
        var $uses = array('Test'); 
    
        function say_hello() { 
        $this->Test->query("select * from test where id=0"); 
        echo "hello"; 
        } 
    } 
    
  4. 在那之後,我訪問的鏈接的「http://本地主機/應用/ say_hello」,並花了超過1秒響應。

如果我註釋掉的查詢語句如下:

class AppController extends Controller { 

    var $uses = array('Test'); 

    function say_hello() { 
     //$this->Test->query("select * from test where id=0"); 
     echo "hello"; 
    } 
} 

然後,只花了約60ms的響應。

這對我來說不正確,因爲在空表上執行簡單查詢不應該花費大約940ms。我已經嘗試使用DebugKit進行調試,並且它顯示ControllerAction(在這種情況下,say_hello操作非常簡單)所花費的時間超過了1秒。還要注意緩慢問題不是由數據庫引起的,因爲DebugKit顯示執行say_hello動作時只有一個查詢,並且該查詢幾乎花費了0ms來完成。

我不確定是什麼原因導致了這種緩慢。任何有經驗的CakePHP成員都可以讓我瞭解這種情況下的錯誤嗎?我還應該做些什麼來排除故障並解決問題?

謝謝。

+0

在第一個請求之後請求仍然需要1秒嗎? – Jim

+0

DebugKit應該告訴你這個查詢本身需要多長時間。我假設額外的時間是爲它加載模型或其他類似的東西 - 對吉姆來說,我猜想它不會在第一個之後添加每個查詢額外的1秒。 – Dave

+0

嘗試刪除'$ uses'數組,並用'ClassRegistry :: init('Test') - > query()'替換'$ this-> Test-> query',是否需要更少的時間? (在第一個之後檢查它,並記住清除緩存)。 – Nunser

回答

7

在調試模式下,CakePHP將在很短的時間內刷新數據庫綁定,對象緩存和模式,描述映射到定義模型的表。

之前測試CakePHP的應用程序性能,請確保您更改調試級別設置爲0

+0

調試模式似乎不是原因。我通過添加Configure :: write('debug',0)禁用了調試模式;到core.php,但上述緩慢問題仍然發生。 – user526929

+0

您的tmp目錄是否可以通過webserver/php進程寫入? CakePHP會將表模式保存在tmp/cache中 –

0

請檢查您的網絡服務器和數據庫服務器在同一物理機上。
如果它們在同一臺物理機器上,它所花費的時間應該少一些,通常是幾百毫秒。如果它們不在同一臺物理機器上,那麼網絡延遲將很重要。您可以潛入CakePHP框架的源代碼中,它使用PDO連接數據庫並調用PDO的某些功能,每次由於網絡延遲時間都會花費相當長的時間。所以這個解決方案可能是無用的,你應該編寫一個特定的API,然後用PHP代碼來調用API,而不是直接查詢數據庫。