Cake執行中的DESCRIBE問題

edited 十月 2013 in CakePHP
Cake在每次執行時都會DESCRIBE一下錶,讓人感覺很不爽,而且傚率也會稍微受到影響,有什么辦法可以不讓它執行這個嗎?謝謝!

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3185

評論

  • edited 二月 2008
    也許你可以確認 debug = 0 的環境下會不會有類似狀況。
  • edited 二月 2008
    debug = 0 隻是不輸齣調試信息。

    這裏有一篇相關文章:
    http://kigi1975.spaces.live.com/blog/cns!D8288328C8A05060!579.entry?&_c02_owner=1

    他說道:

    __construct():在Model的__construct()中,我們直接指定了Model各欄位的定義,我們會這麼做的原因是,CakePHP在使用Model時,都會先對資料庫執行describe的指令,來取得該資料表的欄位定義,因此我們先直接指定給Model,省去CakePHP做這樣子的動作。
  • edited 二月 2008
    在 debug = 0 時, Describe 的動作只會進行一次,後續如果沒有更動,程式會從快取資料取得,而不是每次詢問資料庫,這是我的認知,沒有很仔細去看程式碼的細節。
  • edited 二月 2008
    我設置 debug = 0,每次運行時還是會 describe,我用的版本是 1.2.0.6311 beta,在model.php中有 function schema(),
    	function schema($clear = false) {
    		if (!is_array($this->_schema) || $clear) {
    			$db =& ConnectionManager::getDataSource($this->useDbConfig);
    			$db->cacheSources = $this->cacheSources;
    			if ($db->isInterfaceSupported('describe') && $this->useTable !== false) {
    				$this->_schema = $db->describe($this, $clear);
    			} elseif ($this->useTable === false) {
    				$this->_schema = array();
    			}
    		}
    		return $this->_schema;
    	}
    

    應該是在 model 的 __construct() 中設置 $this->_schema 后就不會執行 desc,不過我設置以后沒有髮現有什么變化。
  • edited 二月 2008
    你可以先試試在自己的 model 輸出 schema() 預設會產生的資料格式,接著在自己的 model 中定義 schema() 這個方法去覆蓋繼承而來的方法,傳回上述的資料,應該就可以達到你要的效果。例如:
    function schema() {
    	    return array(
    			'id' => array('type'=>'integer', 'null' => false, 'default' => NULL, 'length' => 3, 'key' => 'primary'),
    			'name' => array('type'=>'string', 'null' => false, 'length' => 50),
    		);
    	}
    

    debug = 0 應該會從快取檔案中取得經常查詢的資料,而不是真的去查詢資料庫,不過我想應該是你沒有開啟快取功能?
    試著把 config/core.php 中的這個項目開啟看看:
    Configure::write('Cache.check', true);
    

    也記得確認一下 tmp/ 這個資料夾以及底下子資料夾網頁伺服器是否可以寫入(Unix like 環境)
  • edited 二月 2008
    谢谢,很好用。
Sign In or Register to comment.