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