Zend框架,学说和缓存问题

时间:2010-08-17 18:43:32

标签: zend-framework caching doctrine

我正在使用Zend Framework的Doctrine 1.2,它运行得很好。现在,我想开始使用结果缓存和查询缓存功能来减少为应用程序提供动力的数据库服务器的负载。哦,我也在使用Zend_Application并将代码放在模块中。

无论如何,我在应用程序本身的整个Bootstrap.php文件中设置了与Doctrine的连接:

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缓存的示例。我发现的看起来非常简单。我将此代码添加到包含_initDoctrine()方法的Bootstrap.php文件中,在_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 个答案:

答案 0 :(得分:1)

有一个解决方案。每次使用static connection()方法时,它都会将其设置为当前连接。为了阻止这种情况发生,您必须使用以下代码:

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

这里重要的部分是openConnection方法的第三个参数。如果设置为true,它将使其成为当前连接。将其设置为false将确保您的主连接保持为当前连接。

答案 1 :(得分:0)

根据Twitter的反馈,决定以APC作为后端,而不是SQLite。