Кэширование объекта PDOStatement в Zend Framework - PullRequest
2 голосов
/ 04 февраля 2012

Я пытаюсь кэшировать результаты запроса, который будет меняться не очень часто, если вообще будет.В моем классе у меня есть закрытая переменная класса private $_cache, и в конструкторе я инициализирую ее так же, как и большую часть своего кэширования:

// Setup caching
$frontendOptions = array('lifeTime' => (strtotime('+1 week') - time()));
$backendOptions = array('cache_dir' => '../application/cache');
$this->_cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);

Позже, в функции, я пытаюсь кэшировать результаты запроса:

$cache_id = 'all_station_results';

if ( ($results = $this->_cache->load($cache_id)) === false )
{           
    // Get all data from stations table
    $sql="SELECT * FROM locations";
    $sth = $this->_db->query($sql);

    // Serialize query results
    $data = serialize($sth);

    // Write to cache
    $this->_cache->save($data, $cache_id);          
} 
else 
{           
    // Return results from cache
    return unserialize($results);           
}

Это вызывает исключение:

Вы не можете сериализовать или десериализовать экземпляры PDOStatement

Поэтому я попытался без сериализации и получаю это исключениеброшено:

Данные должны быть строковыми или заданы automatic_serialization = true

Очевидно, что PDOStatement не является строкой, и я не вижу разницы между настройками automatic_serialization = true и ручная сериализация.

Как я могу кешировать этот объект PDOStatement?

1 Ответ

3 голосов
/ 04 февраля 2012

AFAIK, вы вообще не можете сериализовать объекты PDO: они тесно связаны с нижележащим драйвером базы данных и открытым в данный момент соединением.

Вам придется кэшировать массив, содержащий результаты вызова базы данных . Это не обязательно может помочь вашей производительности, хотя: выборка большого количества данных из кэша (или хранение всего этого в памяти скрипта PHP) может занять столько же времени, сколько и вызов базы данных, особенно если таблица правильно проиндексирована.

Использование нормального соединения с базой данных может быть правильным путем; если у вас есть полный контроль над вашей базой данных, и вы используете mySQL, вы также можете рассмотреть кэширование запросов mySQL .

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