Zend Framework, доктрина и проблемы кеширования - PullRequest
1 голос
/ 17 августа 2010

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

В любом случае я настраиваю свои подключения к Doctrine в общем файле 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"]);  
}

СейчасЯ потратил некоторое время на чтение документации для кэширования запросов и результатов для Doctrine и в поисках примеров использования кэширования Doctrine.То, что я нашел, кажется очень простым.Я добавил этот код в файл 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.

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

Ответы [ 2 ]

1 голос
/ 13 августа 2011

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

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

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

0 голосов
/ 18 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...