2013-10-30 65 views
0

我的問題是基本上,該原則在重新運行相同的查詢時不使用APC緩存的結果。正因爲如此,我得到了很長的執行時間。我在網上沒有發現類似的問題。laravel4學說不使用APC緩存

我的環境:

WAMP(32位)與PHP 5.4.16上的Windows7。 遠程數據庫上的MySQL數據庫平均ping爲87ms。 Laravel4通過作曲家安裝laravel-學說包:

doctrine/dbal - 2.4.x-dev 
doctrine/orm - 2.4.x-dev 

我的問題:

緩存學說查詢構建器不使用緩存的APC數據。

查詢:

$query = Doctrine::createQueryBuilder(); 

    $query->select('e')->from("Persistent\Users\Experts\Expert", "e"); 

    $this->prepareSort($sort, $query); 
    $query->orderBy($this->sortField, $this->sortVector); 

    //prepare paginator 
    $queryPaginator = new DoctrinePaginator($query); 
    $this->total = $queryPaginator->count(); 

    return $queryPaginator ->getQuery() 
          ->setResultCacheDriver(new ApcCache()) 
          ->useResultCache(true, 300, 'expertsearch') 
          ->setFirstResult(0) 
          ->setMaxResults(20) 
          ->getResult(); 

結果:

的查詢需要17秒左右,因爲我的機器和數據庫服務器之間的距離來完成。

如上所示啓用緩存不會影響速度。

的APC使用緩存如下所示:

DoctrineNamespaceCacheKey[] 1 584 2013/10/30 08:33:08 2013/10/30 08:33:08 2013/10/30 08:33:08 None [Delete Now] 
[expertsearch][1] 0 27880 2013/10/30 08:33:08 2013/10/30 08:33:08 2013/10/30 08:33:08 300 seconds [Delete Now] 
[121cbb9b3c38e7d5a0c0e7b74c59e640][1] 0 3672 2013/10/30 08:33:08 2013/10/30 08:33:08 2013/10/30 08:33:08 None [Delete Now] 

Webgrind顯示來電的數量沒有變化,以PDO相比,當在查詢生成器不使用高速緩存。

Function  Invocation Count Total Self Cost  Total Inclusive Cost 
php::PDOStatement->execute  183  15932 15932 
php::PDO->query   7 588  588 

回答

0

APC緩存用於存儲OPCode,如果你想存儲查詢,您應該使用Memcache

http://docs.doctrine-project.org/en/2.0.x/reference/caching.html#memcache

編輯1

正如你問我發展我的答案我會這樣做的。

PHP如何工作(簡體)? RE2C將首先進行詞法分析(對於=> PHP5.3和Flex,對於< = PHP5.2)。

Tokens生成。然後,解析器不得不分析令牌。例如,它看起來,如果你有一個「(」功能(T_FUNCTION, T_IF, T_OPEN ...)解析器的名稱是Bison

然後,你的代碼在編譯表的OPCode。 對於結束後,有一個執行器如果你想將執行代碼PHP

所以,只要執行你的代碼,而不是分析和解析..所以你可以使用一個像PHP acceleratorAPC。所以,你PHP代碼將執行速度快了很多,但是,在每次調用代碼時都會執行查詢。你是對的,Doctrine的文檔沒有說它不存儲查詢的結果,但是因爲它使用APC,它只是存儲查詢。

Memcache是一個分佈式對象緩存內存系統,它存儲查詢結果。它有一個分佈式服務器。

我希望我在此響應更加清晰,對不起,如果我的英語不是很好......

+0

提供的不說,該文檔的URL'APC'不存儲查詢結果。事實上,它甚至展示了一個如何使用'APC'的例子:http://docs.doctrine-project.org/en/2.0.x/reference/caching.html#apc – Mark

+0

你能否多開發一些答案? – Mark