Zend Config Ini Caching - PullRequest
       18

Zend Config Ini Caching

4 голосов
/ 27 июля 2011

Приложение My Zend использует 3 файла конфигурации ini, для анализа которых требуется более 200 строк, содержащих более 100 инструкций.Эти файлы анализируются каждый запрос?Некоторые люди говорят, что они (например, здесь и здесь ).Если это так, разве это не проблема эффективности?

Комментарии в этих ссылках имеют смешанные чувства - некоторые говорят, что вам следует избегать конфигурационных файлов ini и выполнять настройку на PHP, некоторые говорят, что вы можете использовать Zend_Cache_Frontend_File, а некоторыеэто просто не проблема.Но, разумеется, синтаксический анализ 200 строк текста для каждого запроса быстро станет проблемой, если вы ожидаете довольно большой трафик?

Если вы все же порекомендуете использовать метод кэширования, не могли бы вы объяснить, как именно вы бы это реализовали?

Ответы [ 4 ]

10 голосов
/ 27 июля 2011

Да, они анализируются каждый раз, если вы не кешируете их. Это действительно экономит время (я проверил это в своем собственном проекте).

Так как же вы используете Zend_Cache_Frontend_File для кэширования INI-файла? Ну, я могу привести вам пример. В моем проекте у меня есть файл route.ini, который содержит несколько пользовательских маршрутов:

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

В моем Bootstrap.php Я загружаю их, используя кеш (если возможно):

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

Надеюсь, это поможет.

4 голосов
/ 27 июля 2011

Если вы загружаете фреймворк, такой как ZF, вы загружаете десятки файлов с тысячами строк кода. Файлы должны быть прочитаны для каждого пользователя и запроса. На стороне сервера у вас есть некоторое кеширование с контроллерами диска и так далее, так что файлы не должны быть фактически прочитаны с диска каждый раз. Кроме того, диспетчеры памяти в операционной системе отслеживают это и обеспечивают некоторое кэширование в памяти, так что это не должно быть считано в память каждый раз - только вне. Затем у вас обычно есть база данных, где происходит более или менее то же самое, потому что база данных в конечном итоге хранится в файле на жестком диске. Сервер БД читает файл и ту же историю более или менее.

Итак, я бы беспокоился о нескольких строках в файле конфигурации? Конечно, не потому, что мне нужны данные для работы моего приложения. То, откуда оно приходит, вторично.

О кешировании с Zend_Cache. Если у вас есть данные, которые являются компактными и не требуют большой обработки, как файлы в Zend_Config, вы сэкономите крошечные микросекунды. По сути, вы храните компактный формат в другом компактном формате; сериализованные строки, которые должны быть снова не сериализованы. Если вы можете кэшировать данные, чтобы избежать доступа к базе данных или рендеринга всего представления, включая все запросы данных с включенными моделями, мы говорим о совершенно другой истории.

2 голосов
/ 08 июня 2014

Если вы предполагаете, что PHP-файл кэшируется в памяти по сравнению с анализируемым INI-файлом, который также находится в памяти, вы можете получить производительность, конвертируя INI-файл в PHP-файл, пропуская класс Zend_Config_Ini и процесс синтаксического анализа.

# 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

vs Кэшированная конфигурация:

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 голосов
/ 29 декабря 2014

По словам нашего друга, который создал файлы:

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);
}
...