Query Cache Behavior
The query_cache
behavior gives a speed boost to Propel queries by caching the transformation of a PHP Query object into reusable SQL code.
Basic Usage
In the schema.xml
, use the <behavior>
tag to add the query_cache
behavior to a table:
<table name="book">
<column name="id" required="true" primaryKey="true" autoIncrement="true" type="integer" />
<column name="title" type="varchar" required="true" primaryString="true" />
<behavior name="query_cache" />
</table>
After you rebuild your model, all the queries on this object can now be cached. To trigger the query cache on a particular query, just give it a query key using the setQueryKey()
method. The key is a unique identifier that you can choose, later used for cache lookups:
<?php
$title = 'War And Peace';
$books = BookQuery::create()
->setQueryKey('search book by title')
->filterByTitle($title)
->findOne();
The first time Propel executes the termination method, it computes the SQL translation of the Query object and stores it into a cache backend (APC by default). Next time you run the same query, it executes faster, even with different parameters:
<?php
$title = 'Anna Karenina';
$books = BookQuery::create()
->setQueryKey('search book by title')
->filterByTitle($title)
->findOne();
TipThe more complex the query, the greater the boost you get from the query cache behavior.
Parameters
You can change the cache backend and the cache lifetime (in seconds) by setting the backend
and lifetime
parameters:
<table name="book">
<column name="id" required="true" primaryKey="true" autoIncrement="true" type="integer" />
<column name="title" type="varchar" required="true" primaryString="true" />
<behavior name="query_cache">
<parameter name="backend" value="custom" />
<parameter name="lifetime" value="600" />
</behavior>
</table>
To implement a custom cache backend, just override the generated cacheContains()
, cacheFetch()
and cacheStore()
methods in the Query object. For instance, to implement query cache using Zend_Cache and memcached, try the following:
<?php
class BookQuery extends BaseBookQuery
{
public function cacheContains($key)
{
return $this->getCacheBackend()->test($key);
}
public function cacheFetch($key)
{
return $this->getCacheBackend()->load($key);
}
public function cacheStore($key, $value)
{
return $this->getCacheBackend()->save($key, $value);
}
protected function getCacheBackend()
{
if (self::$cacheBackend === null) {
$frontendOptions = array(
'lifetime' => 7200,
'automatic_serialization' => true
);
$backendOptions = array(
'servers' => array(
array(
'host' => 'localhost',
'port' => 11211,
'persistent' => true
)
)
);
self::$cacheBackend = Zend_Cache::factory('Core', 'Memcached', $frontendOptions, $backendOptions);
}
return self::$cacheBackend;
}
}