Expirace cache ve stanovené datum, když je potřeba získání datumu zacachovat

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Milanov
Člen | 51
+
0
-

Ahoj. Mám v šabloně zacachovaný kus kódy a vím datum, kdy je potřeba cache invalidovat. Problém je, že získat si to datum znamená komplikovaný výpočet a kdesicosi přes databázi, takže bych potřeboval ideálně zacachovat i to získání datumu.

Je možné např. expire cache nastavit uvnitř makra? Třeba nějak takto?

{cache key, tags => [...]}
     {cacheExpire $item->getDateTime()}
     .....
{/cache}

Nebo mě ještě napadlo řešení:

{cache key}
     {cache key, tags => [...], expire => $item->getDateTime()}
          .....
     {/cache}
{/cache}

Nebo nějak úplně jinak? Díky

Jan Endel
Člen | 1016
+
0
-

tyhle věci imho do šablony přímo nepatří, což takhle mít na to service:

class ExpireChecker
{
	public function getExpireDate
	{
		if ($this->datum_je_v_cachi) {
			return $this->datum
		} else {
			$this->datum = $this->slozity_vypocet_data
			return $this->datum;
		}
	}
}

no a v presenteru:

public function renderDefault
{
	$this->template–>expireDate = $this->service->getExpireDate();
}

a v šabloně:

{cache 'expire' => $expireDate}
Milanov
Člen | 51
+
0
-

Jasně, jen jsem potřeboval demonstrovat funkčnost. Zásadní je, že nevím, jestli něco jako makro cacheExpire existuje.

Milanov
Člen | 51
+
0
-

Právě testuji druhou možnost a jsem docela nadšený. Udělal jsem toto:

{cache key}
     {cache key, tags => $item->getTags(), expire => $item->getDateTime()}
          .....
     {/cache}
{/cache}

Řešení má za následek, že první načtení pracně spočítá tagy (u nás to jsou tagy navazujících entit, nebo kolekcí entit) a datum (opět se získává z databáze, konkrétně jde o datum konce platnosti přiřazené akce). Druhé načtení již ani tagy, ani datum nepočítá, jenom si šáhne přímo do cache. Jedině je nutné získat závislosti pro klíč a ty mít v obou cachích stejné. Ale to musí být vždy.

Kdyby takto interně makro pracovalo automaticky, bylo by to super. Problém je jen ten, že se data ukládají do cache 2×.

Editoval Milanov (15. 5. 2015 21:56)

Jan Endel
Člen | 1016
+
0
-

do cache do tagu expiration se může hodit i přímo datetime

Svaťa Šimara
Člen | 98
+
+1
-

Cache v Latte nově podporuje tzv. dependencies:

<?php
{cache key, dependencies => $createDependencies()}
...
{/cache}
?>

A v presenteru/komponentě šabloně řekneš, co že to createDependencies má vlastně dělat:

<?php
public function render() { //nebo renderXXX
	$this->template->createDependencies = function() {
		$item = $this->getItem();
		return ['tags' => $item->getTags(), 'expire' => $item->getDateTime()];
	}
}
?>

Finta je v tom, že ona funkce vracející tagy a expiraci je volána pouze při vytváření cache.
A do té funkce createDependencies může jít klidně ID itemu:

<?php
{cache key, dependencies => $createDependencies($id)}
...
{/cache}

...
$this->template->createDependencies = function($id) {
	$item = $this->getItem($id);....
}
?>

Pokud sem to vysvětlil nepochpitelně, tady je test: https://github.com/…teCache.phpt#…

Milanov
Člen | 51
+
0
-

Paráda, to je přesně ono. Jen koukám, že to není v dokumentaci ještě? Nebo jo? No a škoda, že to není už v Nette 2.1, ale to už je můj problém.