在 Zend Framework 中缓存数据库查询结果
Caching database query results in Zend Framework
我是 Zend 的初学者,在尝试缓存数据库查询结果时遇到了一些问题。
我已经阅读了很多这样的论坛和文档http://framework.zend.com/manual/1.12/en/zend.db.table.html(示例 31),但他们通常都说要在构造方法中设置 $defaultMetadataCache。
我做到了,但是好像没有读取缓存,因为我没有得到更好的性能。
这是我构建的文件 ./library/Zend/Db/Table/Abstract.php
public function __construct($config = array())
{
/**
* Allow a scalar argument to be the Adapter object or Registry key.
*/
if (!is_array($config)) {
$config = array(self::ADAPTER => $config);
}
if ($config) {
$this->setOptions($config);
}
$config_temp = new Zend_Config_Ini(APPLICATION_PATH . '/configs/config.ini', APPLICATION_ENV);
$cache_lifetime = (isset($config_temp->cache->lifetime) && $config_temp->cache->lifetime) ? $config_temp->cache->lifetime : 300;
$cache_dir = (isset($config_temp->cache->dir) && $config_temp->cache->dir) ? $config_temp->cache->dir : '/tmp/hookit/cache/';
if(!is_dir($cache_dir))
mkdir ($cache_dir, 0755, true);
$frontendOptions = array('lifetime' => $cache_lifetime, 'automatic_serialization' => true);
$backendOptions = array('cache_dir' => $cache_dir);
$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
if(!self::getDefaultMetadataCache()){
self::setDefaultMetadataCache($cache);
}
$this->_setup();
$this->init();
}
$defaultMetadataCache
参数只允许缓存 table 的元数据(不是某些查询的结果)。
它很有用,因为
By default, Zend_Db_Table_Abstract queries the underlying database for
table metadata whenever that data is needed to perform table
operations.
但是一旦此缓存选项仅用于 table 元数据,您似乎就不会像将所有查询缓存到数据库中那样显着提高性能。
您还使用 File
作为 Zend_Cache
后端。这意味着您将缓存数据存储在常规 OS 文件中,这与将数据存储在数据库中相同,后者也使用文件来存储数据。
更好的方法(为了改善 performance/decrease 延迟)是将缓存数据存储在 RAM 中并缓存所有查询(不仅仅是 table 的元数据)。
我是 Zend 的初学者,在尝试缓存数据库查询结果时遇到了一些问题。
我已经阅读了很多这样的论坛和文档http://framework.zend.com/manual/1.12/en/zend.db.table.html(示例 31),但他们通常都说要在构造方法中设置 $defaultMetadataCache。
我做到了,但是好像没有读取缓存,因为我没有得到更好的性能。
这是我构建的文件 ./library/Zend/Db/Table/Abstract.php
public function __construct($config = array())
{
/**
* Allow a scalar argument to be the Adapter object or Registry key.
*/
if (!is_array($config)) {
$config = array(self::ADAPTER => $config);
}
if ($config) {
$this->setOptions($config);
}
$config_temp = new Zend_Config_Ini(APPLICATION_PATH . '/configs/config.ini', APPLICATION_ENV);
$cache_lifetime = (isset($config_temp->cache->lifetime) && $config_temp->cache->lifetime) ? $config_temp->cache->lifetime : 300;
$cache_dir = (isset($config_temp->cache->dir) && $config_temp->cache->dir) ? $config_temp->cache->dir : '/tmp/hookit/cache/';
if(!is_dir($cache_dir))
mkdir ($cache_dir, 0755, true);
$frontendOptions = array('lifetime' => $cache_lifetime, 'automatic_serialization' => true);
$backendOptions = array('cache_dir' => $cache_dir);
$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
if(!self::getDefaultMetadataCache()){
self::setDefaultMetadataCache($cache);
}
$this->_setup();
$this->init();
}
$defaultMetadataCache
参数只允许缓存 table 的元数据(不是某些查询的结果)。
它很有用,因为
By default, Zend_Db_Table_Abstract queries the underlying database for table metadata whenever that data is needed to perform table operations.
但是一旦此缓存选项仅用于 table 元数据,您似乎就不会像将所有查询缓存到数据库中那样显着提高性能。
您还使用 File
作为 Zend_Cache
后端。这意味着您将缓存数据存储在常规 OS 文件中,这与将数据存储在数据库中相同,后者也使用文件来存储数据。
更好的方法(为了改善 performance/decrease 延迟)是将缓存数据存储在 RAM 中并缓存所有查询(不仅仅是 table 的元数据)。