2010-08-17 3 views
1

Я использую Doctrine 1.2 с Zend Framework, и он работает отлично. Теперь я хочу начать использовать кеширование результатов и кеширование запросов, чтобы уменьшить нагрузку на сервер БД, который обеспечивает работу приложения. О, я также использую Zend_Application и размещаю код в модулях.Zend Framework, Doctrine и Caching Problems

Во всяком случае, я установка моих подключений к доктрине в общем файле Bootstrap.php для самого приложения:

protected function _initDoctrine() 
{ 
    Zend_Loader_Autoloader::getInstance()->registerNamespace('Doctrine')->pushAutoloader(array('Doctrine', 'autoload')); 

    $manager = Doctrine_Manager::getInstance(); 

    foreach ($this->_options['doctrine']['attr'] as $key => $val) { 
     $manager->setAttribute(constant("Doctrine::$key"), $val); 
    } 

    $conn = Doctrine_Manager::connection($this->_options['doctrine']['dsn'], 'doctrine'); 

    Doctrine::loadModels($this->_options["doctrine"]["module_directories"]); 
} 

Теперь, я провел некоторое время на чтение как документации для запросов и результатов кэширования для Доктрины и ищет примеры использования кэширования Доктрины. То, что я нашел, кажется очень простым. Я добавил этот код в файл Bootstrap.php, который содержит метод _initDoctrine(), внутри _initDoctrine()

// Set up some caching 
    $cacheConn = Doctrine_Manager::connection(new PDO('sqlite::memory:')); 
    $cacheDriver = new Doctrine_Cache_Db(array(
     'connection' => $cacheConn, 
     'tableName' => 'cache')); 
    $cacheDriver->createTable(); 
    $manager->setAttribute(Doctrine_Core::ATTR_QUERY_CACHE, $cacheDriver); 

Что я теперь найти происходит то, что все соединения для применения в настоящее время считает, что его использует Sqlite вместо от MySQL, как это предполагается. Это кажется странным, поскольку я устанавливаю атрибут ATTR_QUERY_CACHE.

Советы по разрешению этого были бы весьма полезны.

ответ

0

Решил пойти с APC в качестве бэкэнд вместо SQLite, основываясь на отзывах Twitter.

1

Существует решение этого вопроса. Каждый раз, когда вы используете метод static connection(), он устанавливает это как текущее соединение. Для того, чтобы остановить это от случаться вы должны использовать следующий код:

$manager = Doctrine_Manager::getInstance(); 
$cacheConn = $manager->openConnection(new PDO('sqlite::memory:'), 'cache', false); 

Важной частью здесь является третий аргумент метода OpenConnection. Если установлено значение true, это сделает текущее соединение. Установка его на значение false гарантирует, что ваше основное соединение останется текущим.