Criando page caching com dependências ao invés de controle de tempo apenas
Além da expiração por tempo, uma forma útil é expirar por dependência. A dependência pode ser por alteração de um arquivo (no Rails se usava muito um touch em tmp/restart.txt para recarregar uma aplicação em produção) ou uma consulta que retornava um valor (ver mais aqui). Todas são interessantes e úteis em algum momento.
A mais usual, para mim, é sempre a CDbCacheDependency, como o exemplo abaixo:
array( 'COutputCache + index', 'duration' => 7200, 'varyByParam' => array('id'), 'dependency' => array( 'class' => 'CDbCacheDependency', 'sql' => 'select max(id) from clientes', ), ),
Dessa forma, caso um novo cliente seja incluído, a página irá expirar, mesmo antes do tempo estipulado.
Usando o CChainedCacheDependency
O Yii também pode usar a dependência de forma múltipla. Nesse caso, mais de um atributo permite expirar a página. Esse é um caso interessante para dashboards, como no exemplo abaixo:
array( 'COutputCache + index', 'duration' => 7200, 'varyByParam' => array('id'), 'dependency' => array( 'class' => 'CChainedCacheDependency', 'dependencies' => array( array( 'class' => 'CDbCacheDependency', 'sql' => 'select max(id) from vendas', ), array( 'class' => 'CDbCacheDependency', 'sql' => 'select MAX(id) from clientes', ), ), ), ),