2011-07-27 27 views
4

My Zendアプリは、3つのini設定ファイルを使用し、合計200行以上を解析し、100を超える命令を含んでいます。これらのファイルはリクエストごとに解析されていますか?何人かは(herehereのように)もしそうなら、これは効率の問題ではないですか?Zend Config Iniキャッシング

これらのリンクには、ini設定ファイルを避け、PHPで設定する必要があるとか、Zend_Cache_Frontend_Fileを使うことができるとか、問題ではないとかいう意見もあります。しかし、あなたはかなりのトラフィックを期待している場合は、必ずすべての要求の200行のテキストを解析することは問題になりますか?

キャッシュテクニックを使用することをお勧めする場合は、実装方法を正確に説明してください。

答えて

10

はい、キャッシュするまで、毎回解析されます。それは本当に時間を節約します(自分のプロジェクトでチェックしました)。

したがって、Zend_Cache_Frontend_Fileを使用してiniファイルをキャッシュするにはどうすればよいですか?まあ、私は例を提供することができます。私は(可能であれば)キャッシュを使用してそれらをロード私のbootstrap.phpの

routes.ini

routes.showacc.route = "/@show/:city/:id/:type" 
routes.showacc.type = "Zend_Controller_Router_Route" 
routes.showacc.defaults.module = default 
routes.showacc.defaults.controller = accommodation 
routes.showacc.defaults.action = show 
routes.showacc.defaults.city = 
routes.showacc.defaults.type = 
routes.showacc.defaults.id = 
routes.showacc.defaults.title = 
routes.showacc.reqs.id = "\d+" 

;and more 

:私のプロジェクトで、私は、カスタムルートの数が含まれているroute.iniファイルを持っています:

protected function _initMyRoutes() { 
    $this->bootstrap('frontcontroller'); 
    $front = Zend_Controller_Front::getInstance(); 
    $router = $front->getRouter(); 

    // get cache for config files 
    $cacheManager = $this->bootstrap('cachemanager')->getResource('cachemanager'); 
    $cache = $cacheManager->getCache('configFiles'); 
    $cacheId = 'routesini'; 

    // $t1 = microtime(true); 
    $myRoutes = $cache->load($cacheId); 

    if (!$myRoutes) { 
     // not in cache or route.ini was modified. 
     $myRoutes = new Zend_Config_Ini(APPLICATION_PATH . '/configs/routes.ini'); 
     $cache->save($myRoutes, $cacheId); 
    } 
    // $t2 = microtime(true); 
    // echo ($t2-$t1); // just to check what is time for cache vs no-cache scenerio 

    $router->addConfig($myRoutes, 'routes'); 
} 

を次のようにキャッシュが私の のapplication.iniに設定され
resources.cachemanager.configFiles.frontend.name = File 
resources.cachemanager.configFiles.frontend.customFrontendNaming = false 
resources.cachemanager.configFiles.frontend.options.lifetime = false 
resources.cachemanager.configFiles.frontend.options.automatic_serialization = true 
resources.cachemanager.configFiles.frontend.options.master_files[] = APPLICATION_PATH "/configs/routes.ini"  
resources.cachemanager.configFiles.backend.name = File 
resources.cachemanager.configFiles.backend.customBackendNaming = false 
resources.cachemanager.configFiles.backend.options.cache_dir = APPLICATION_PATH "/../cache" 
resources.cachemanager.configFiles.frontendBackendAutoload = false 

希望します。

+1

マルチン、あなたのポストは、私を助けて、今私はそれを使用して、より良い性能を持っています。しかし、キャッシュオブジェクトをロードしようとするのではなく、次のようにしてください: $ cache = $ cacheManager-> getCache( 'configFiles'); 次のように最初に存在するかどうかチェックします。 if($ cacheManager-> hasCache($ routeCache)){ $ cache = $ cacheManager-> getCache($ routeCache); // ... } –

+0

私のために働いた。ありがとう。 –

4

ZFのようなフレームワークをロードすると、数千行のコードを含む数十のファイルが読み込まれます。ファイルは、すべてのユーザーおよび要求ごとに読み取られなければなりません。サーバ側では、ディスクコントローラやその他のファイルをキャッシュしているので、ファイルを毎回ディスクから実際に読み取る必要はありません。また、オペレーティングシステムのメモリマネージャーはそれを追跡し、メモリにキャッシュを提供するので、毎回メモリに読み込む必要はありません。次に、通常はデータベースがハードドライブ上のファイルに格納されるため、多かれ少なかれ同じことが起こるデータベースがあります。 DBサーバーは、ファイルと同じ話を多かれ少なかれ読み込みます。

私は設定ファイルの中でいくつかの行が心配ですか?私のアプリケーションが動作するために必要なデータではないからです。そこから来ているのは二次的です。

Zend_Cacheによるキャッシュについてあなたがコンパクトで、Zend_Configのファイルのように多くの処理を必要としないデータを持っているなら、小さなマイクロ秒を節約できます。基本的にコンパクトなフォーマットを別のコンパクトフォーマットに格納しています。シリアル化された文字列は、再度シリアル化されなければなりません。データをキャッシュして、データベースへのアクセスを回避したり、モデルのすべてのデータ要求を含めた全体像をレンダリングすることができれば、私たちは全く別の話をしています。

+1

一般的に、この答えは正しいでしょう、あなたはマイクロ最適化したくありません。しかし、Zendは多くのアクションをバックグラウンドで実行しています。最近のプロファイリングでは、古いバージョンのフレームワーク(1.11.4)を使っていましたが、Zend_Configクラスからはいくらかのひどいパフォーマンスが出ています。使用中のカスタム配列再帰関数があります。これは、設定ファイルの読み込み/解析中に何千回も呼び出され、数百ミリ秒の読み込み時間につながります。この場合のconfigオブジェクトのキャッシュは、それに相当な価値があります。 – zombat

+0

@ zombatフェア十分です。あなたが言及した再帰は、異なるセクションのマージ/カスケードのためのものであり、生産システム上の生産セクションの外と外に多くの情報を持っていることを率直に言っているわけではありません。これがZF2から削除された主な理由だと思います。 –

2

メモリにもPHPファイルがキャッシュされていると仮定すると、メモリ内にある解析されたiniファイルがキャッシュされ、Zend_Config_Iniクラスをスキップしてプロセスを解析しながらiniファイルをPHPファイルに変換できます。

# public/index.php 
$cachedConfigFile = APPLICATION_PATH.'/../cache/application.ini.'.APPLICATION_ENV.'.php'; 

if(!file_exists($cachedConfigFile) || filemtime($cachedConfigFile) < filemtime(APPLICATION_PATH . '/configs/application.ini')) 
{ 
    require_once 'Zend/Config/Ini.php'; 
    $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', APPLICATION_ENV); 
    file_put_contents($cachedConfigFile, '<?php '.PHP_EOL.'return '.var_export($config->toArray(),true).';'); 
} 

$application = new Zend_Application(
    APPLICATION_ENV, 
    $cachedConfigFile // originally was APPLICATION_PATH . '/configs/application.ini' 
); 

$application->bootstrap() 
     ->run(); 

私はabでテストしました。非キャッシュされた設定:キャッシュされたコンフィグ対

ab -n 100 -c 100 -t 10 http://localhost/ 
Requests per second: 45.57 [#/sec] (mean) 
Time per request:  2194.574 [ms] (mean) 
Time per request:  21.946 [ms] (mean, across all concurrent requests) 
Transfer rate:   3374.08 [Kbytes/sec] received 

Requests per second: 55.24 [#/sec] (mean) 
time per request:  1810.245 [ms] (mean) 
Time per request:  18.102 [ms] (mean, across all concurrent requests) 
Transfer rate:   4036.00 [Kbytes/sec] received 

18%優れたパフォーマンスです。

0

は、ファイルを作成した私たちの友人によると:

https://github.com/QualityCase/Mini-Case/blob/master/modules/admin/Bootstrap.php

私は、これは非常に有用であることが判明:

protected function _initConfig() 
{ 
    if(!$config = $this->_cache->load('config')) { 

     $config = new Zend_Config_Ini(BASE_PATH . '/configs/application.ini'); 
     $config = $config->toArray(); 

     $this->_cache->save($config, 'config'); 
    } 

    Zend_Registry::set('config', $config); 
} 
関連する問題