Кеширование запросов DESCRIBE при работе с моделями в Zend Framework
Добрый всем день!
Если вы пишите свой сайты с использованием ZendFramework и при этом используете модели для работы с БД, то вы должны знать, что сам фреймворк первым запросом будет получать информации о таблицы с которой работает:
DESCRIBE `table_name`;
следовательно каждый раз фреймворк делает чтение её структуры, что приводит к лишнему запросу и когда таблиц много или посетителей ресурса — тормозам.
На самой странице документации к зенду описана такая ситуация.
Я создал абстрактный класс от которого должны наследоваться все мои модели, назвал его AbstractTableModel, вот его код:
<?php /** * Class fot caching describe table query * * @filesource * @author maxnag */ abstract class AbstractTableModel extends Zend_Db_Table_Abstract { public function __construct($config = array()) { parent::__construct($config); if (Zend_Db_Table_Abstract::getDefaultMetadataCache() === null) { $frontendOptions = array('automatic_serialization' => true); $zendCacheDir = './cache/'; // directory for caching if (!file_exists($zendCacheDir)) { mkdir($zendCacheDir, 0777); } $backendOptions = array('cache_dir' => $zendCacheDir); $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); Zend_Db_Table_Abstract::setDefaultMetadataCache($cache); } } }
В корне проекте будет создаваться папка cache и в ней будет храниться описание затронутых таблиц, зенд сам следит за временем кеша, единственное я после изменения структуры таблицы удаляю весь кеш, дабы все шло гладко.
Удачи, Максим.
Статья просмотренна 95721 раз, зашло посетителей 16368