Memcached + Doctrine + Zend Framework
Совмещаем все это вместе, получаем неплохое ускорение работы доктрины.
Ставим memcached
Как Установить Memcached на windows?
- качаем отсюда бинарник http://code.jellycan.com/memcached/
- ложим в c:\memcached (или другой путь)
- из консоли инсталим как сервис c:\memcached\memcached.exe -d install
Установка под *nix ищется на ура в гугли.
bootstrap
(привожу весь код инитера доктрины)
/* * Init Doctrine */ protected function _initDoctrine() { $config=$this->getOption('database'); require_once 'Doctrine.php'; $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->registerNamespace('Doctrine'); try { Doctrine_Manager::connection("mysql://".$config['params']['username'].":".$config['params']['password']."@".$config['params']['host']."/".$config['params']['dbname'])->setCharset($config['charset']); } catch (Exception $e) { echo 'FATAL ERROR: MySql is down'; exit; } Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_AGGRESSIVE); Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true); Doctrine::loadModels(APPLICATION_ROOT . "/models"); // Install Tables Doctrine::createTablesFromModels(APPLICATION_ROOT . "/models"); // Cache $configCache=$this->getOption('cache'); // Clearer -------------------------------------------------------- $memcache_obj = new Memcache; $con=$memcache_obj->connect($configCache['host'], $configCache['port']); if ($con==FALSE) { echo 'FATAL ERROR: MemCache is down'; exit; } //$memcache_obj->flush(); // отчистка кеша // --------------------------------------------------------------- $servers = array( 'host' => $configCache['host'], 'port' => $configCache['port'], 'persistent' => true ); $cacheDriver = new Doctrine_Cache_Memcache(array( 'servers' => $servers, 'compression' => false ) ); Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_QUERY_CACHE, $cacheDriver); Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_QUERY_CACHE_LIFESPAN, 3600); Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_RESULT_CACHE, $cacheDriver); Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_RESULT_CACHE_LIFESPAN, 3600); }
Все проинииализили и сказали Doctrine что нужно использовать memcache при запросах и выдачи результата
Если у вас в проекте есть Zend_Translate то подцепляем и его:
$configCache=$this->getOption('cache'); $backendOptions=array( 'host' => $configCache['host'], 'port' => $configCache['port'], 'persistent' => true ); $cache = Zend_Cache::factory('Core', 'Memcached', $frontendOptions, $backendOptions); Zend_Translate::setCache($cache);
везде используются данные из конфига (ini) вот кусок:
; cache memcached cache.host = localhost cache.port = 11211
Запросы
1. После тестов, прямые запросы (DQL) выполняются намного шустрей, т.е.:
$q = Doctrine_Query::create() ->select('id, url') ->from('NewsCategories'); $newsCategories= $q->execute()->toKeyValueArray("id","url");
Намного шустрей чем удобное
$newsCategories=Doctrine::getTable("NewsCategories")->findAll()->toKeyValueArray("id","url");
и плюс, в последнем запросе нельзя указывать что нужно использовать кеш (!!!)
теперь все свои запросы приводим в вид «юзай кеш»
$q = Doctrine_Query::create() ->select('id, url') ->from('NewsCategories') ->useCache(); $newsCategories= $q->execute()->toKeyValueArray("id","url");
все =)
Уникальных посетителей темы: 189Doctrine & Zend Framework 1.8 (zf1.8)
В ветке 1.8 были изменены методы инициалиции, в частности все вынесенно в Bootstrap.php. Теперь о том как подключить Doctrine к ZF 1.8.4.
В конфиге (application/configs/application.ini) :
1 2 3 4 5 6 | database.adapter = PDO_MYSQL database.params.host = localhost database.params.username = dbloging database.params.password = dbpass database.params.dbname = dbname database.charset = utf8 |
В application/Bootstrap.php добавляем :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | protected function _initDoctrine() { $config=$this->getOption('database'); require_once 'Doctrine.php'; $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->registerNamespace('Doctrine'); Doctrine_Manager::connection("mysql://".$config['params']['username'].":".$config['params']['password']."@".$config['params']['host']."/".$config['params']['dbname'])->setCharset($config['charset']); Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_AGGRESSIVE); Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true); Doctrine::loadModels(APPLICATION_PATH . "/models"); } |
Уникальных посетителей темы: 51Zend Server beta 1
Сегодня Zend выпустил новый продукт, Zend Server beta1 ! Если кратко, то это «подобие» xampp, denwer и т.д. но от самой Zend.
В данный продукт включены следующие компненты:
- Apache 2.2.8
- PHP 5.2.8
- Zend Framework 1.7.4
- PHP optimizer и кучу других продуктов Zend
- Админский интерфейс для быстрой настройки и работы.
Продукт доступен для windows, linux и macOS в двух редакциях:
- Zend Server – после beta он будет выпушен как отдельный коммерческий продукт и будет платным
- Zend Server CE – бесплатный сервер для разработчиков (он не станет платным)
Для получения информации о продукте, перейдите по ссылке.
Уникальных посетителей темы: 6Doctrine & ZF Cheat Sheet
Тут я приведу несколько часто используемых мной приемов для работы с Doctrine и (или) ZF.
1. Выбока по id с проверкой на существование записи:
$courier = Doctrine::getTable("Couriers")->find($this->_getParam('id')); if ($courier===FALSE) throw new Exception("courierId не найден"); $this->view->courier=$courier->toArray();
Теперь по строкам:
- Выбираем из модели Couriers запись с id который нам передал Zend Framework через Router в параметр id.
- Если запись не найденна но генерим новое исключение.
- Передаем «виеву» массив данных от записи.
2. Сбор все related записей у модели
Как неидеальный пример:
$query = new Doctrine_Query(); $query->from('CityAddress ca,ca.CityStreets cs,cs.CityRegions cr') >where("id=?",intval($id) ); $result = $query->execute( array(),Doctrine::HYDRATE_ARRAY );
Что вернет нам не только запись но и все «привязанные» записи (hasOne, hasMany)
3. NOW()
Вернуть текущее время и дату
$messages->date_delivery=new Doctrine_Expression('NOW()');
4. Last Insert ID
Вернуть последний добавленный ID записи
$lastInsertedId=$model->getIncremented();
Уникальных посетителей темы: 98