RSS Feed
Окт 6

Memcached + Doctrine + Zend Framework

Posted on Вторник, октября 6, 2009 in Doctrine, php, ZendFramework, Новости

Совмещаем все это вместе, получаем неплохое ускорение работы доктрины.

Ставим memcached

Как Установить Memcached на windows?

  1. качаем отсюда бинарник http://code.jellycan.com/memcached/
  2. ложим в c:\memcached (или другой путь)
  3. из консоли инсталим как сервис 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");

все =)

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 189

Июл 19

Doctrine & Zend Framework 1.8 (zf1.8)

Posted on Воскресенье, июля 19, 2009 in Doctrine, php, ZendFramework, Новости

В ветке 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");        
    }

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 51

Фев 20

Zend Server beta 1

Posted on Пятница, февраля 20, 2009 in php, Новости

zend-server-event-detailsСегодня 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 в двух редакциях:

  1. Zend Server – после beta он будет выпушен как отдельный коммерческий продукт и будет платным
  2. Zend Server CE – бесплатный сервер для разработчиков (он не станет платным)

Для получения информации о продукте, перейдите по ссылке.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 6

Дек 15

Doctrine & ZF Cheat Sheet

Posted on Понедельник, декабря 15, 2008 in Doctrine, ZendFramework

Тут я приведу несколько часто используемых мной приемов для работы с Doctrine и (или) ZF.

1. Выбока по id с проверкой на существование записи:

$courier = Doctrine::getTable("Couriers")->find($this->_getParam('id'));
if ($courier===FALSE) throw new Exception("courierId не найден");
$this->view->courier=$courier->toArray();


Теперь по строкам:

  1. Выбираем из модели Couriers запись с id который нам передал Zend Framework через Router в параметр id.
  2. Если запись не найденна но генерим новое исключение.
  3. Передаем «виеву» массив данных от записи.

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();

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 98