2012-02-04 4 views
2

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

// 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 = истину

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

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

+0

Я не думаю, что вы можете сериализовать объекты PDO. Почему бы не кэшировать массив, содержащий результаты? –

+0

Что именно вы хотите кэшировать? Если результаты запроса не будут очень большими, рассмотрите кеширование результатов вместо утверждения. –

+0

Это определенно возможность, но надеялась, что вы сможете изменить любые местоположения в моем коде, где выполняется этот запрос, и вместо этого вызвать функцию, которая возвращает PDOStatement, как если бы я вызвал запрос '$ this -> _ db-> ($ sql) но повышает эффективность кэширования. Таким образом, код, который следует за запросами, не должен меняться, потому что он будет работать на PDOStatement и не будет знать разницу. –

ответ

3

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

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

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

+0

Массив может оказаться моим решением. Я бы, конечно, оценил два варианта и посмотрел, какая из них обеспечивает лучшую производительность. –

+1

Таким образом, запрос занимает в среднем 0,075 микросекунды. Когда я преобразовал его в массив и кэшировал его, получение результатов займет 0,035 микросекунды. Не большой прирост производительности, ну ладно. Спасибо за помощь! –

+0

Остерегайтесь проблем с памятью при загрузке потенциально больших массивов. –

Смежные вопросы