5

我的 Zend 应用程序使用 3 个 ini 配置文件,总共需要解析 200 多行,包含 100 多条指令。这些文件是否解析每个请求?有些人说他们是(比如这里这里)。如果是这样,这不是效率问题吗?

这些链接中的评论意见不一——有人说您应该避免使用 ini 配置文件并在 PHP 中进行配置,有人说您可以使用 Zend_Cache_Frontend_File,还有人说这不是问题。但是,如果您预计会有大量流量,那么为每个请求解析 200 行文本肯定会很快成为一个问题?

如果您确实建议使用缓存技术,您能否准确解释一下您将如何实现它?

4

4 回答 4

10

是的,除非您缓存它们,否则每次都会解析它们。它确实节省了时间(我在自己的项目中检查过)。

那么如何使用Zend_Cache_Frontend_File缓存一个ini文件呢?好吧,我可以给你举个例子。在我的项目中,我有 route.ini 文件,其中包含许多自定义路由:

路线.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

希望这可以帮助。

于 2011-07-27T11:46:30.957 回答
4

如果你加载一个像 ZF 这样的框架,你会加载几十个包含数千行代码的文件。必须为每个用户和请求读取文件。在服务器端,您有一些使用磁盘控制器的缓存等等,因此不必每次都从磁盘实际读取文件。此外,操作系统中的内存管理器会跟踪它并为内存提供一些缓存,因此不必每次都将其读入内存 - 只需读取即可。接下来,您通常有一个数据库,其中或多或少会发生相同的事情,因为数据库最终存储在硬盘驱动器上的文件中。数据库服务器或多或少地读取文件和相同的故事。

那么,我会担心配置文件中的几行吗?当然不是因为我的应用程序需要这些数据才能工作。它来自哪里是次要的。

关于使用 Zend_Cache 进行缓存。如果您有紧凑的数据并且不需要像 Zend_Config 中的文件那样进行大量处理,您将获得节省微小的微秒。您实际上是将紧凑格式存储为另一种紧凑格式;必须再次反序列化的序列化字符串。如果您可以缓存数据以避免数据库访问或呈现整个视图,包括所有数据请求以及模型启动,我们正在谈论一个完全不同的故事。

于 2011-07-27T14:16:40.500 回答
3

如果您假设 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%。

于 2014-06-08T17:50:32.823 回答
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);
}
于 2014-12-29T10:41:06.030 回答