Mnoho souborů v cache database – jak pracuje?

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

Zdravím,

všiml jsem si nyní u jednoho projektu, že mi Nette/Database vytváří příliš mnoho souborů v cache. V podstatě během pár minut, kdy se provedlo několik requestů mám v cache již přes 1000 souborů a to se jedná o databázi o pár tabulkách. Kde by mohl být zakopaný pes? Co se vůbec cacheuje?

Doposud jsem předpokládal, že se cachují, jaké jsou cizí klíče u tabulek, které zjistí *Conventional, ale cachuje se asi více věcí?

Převážná část souborů je totožná, konkrétně se jedná o dvě verze:

První typ souborů:

<?php //netteCache[01]000048a:1:{s:4:"time";s:21:"0.62191000 1343896168";}?>
<?php //netteCache[01]000048a:1:{s:4:"time";s:21:"0.72302700 1343896027";}?>

.. a takto dalších pár tisíc souborů, lišící se pouze v oné hodnotě „time“, kde je aktuálná čas

Druhý typ souborů:

<?php //netteCache[01]000070a:2:{s:4:"time";s:21:"0.67341200 1343896168";s:10:"serialized";b:1;}?>a:2:{s:33:"type_discount_category_synonym_id";b:1;s:25:"type_discount_category_id";b:1;}

… u těchto souborů bych řekl, že je asi chyba – jelikož je tam v části ukočené PHP (viz ?>)?

Děkuji za navedení, kde bych mohl hledat zakopaného psa

Editoval frosty22 (2. 8. 2012 10:41)

uestla
Backer | 799
+
0
-

V komentáři v té části s PHP kódem (u první ukázky je to v podstatě celý obsah souboru) jsou serializované údaje o cache – kdy expiruje, na čem závisí, apod.

V té druhé ukázce jsou pak za tímhle PHP kódem už serializovaná samotná do cache ukládaná data. Tzn. že v první ukázce nejsou žádná data v podstatě cachována…

Ale jak se cachuje v NDB, na to si netroufám odpovědět, jen jsem chtěl osvětlit tohle…

frosty22
Člen | 373
+
0
-

Aha, děkuji za objasnění této části :) Ještě tedy zjistit, proč se cachují prázdné soubory, neboť ted jsem u jednoho staršího projektu si toto zkontroloval a již jich tam je několik desítek tisíc (ten již běží na ostrém několik týdnů), což bych řekl není úplně košér, leč tedy to asi nic nebrzdí, tak stejně by mě zajímalo proč.

Ještě pro informaci, testoval jsem na verzi 2.0.2 a nyní jsem nahrál verzi 2.0.4 stable, a zatím to vypadá, že asi je problém stejný, opět se začínají hromadit soubory pomalu.

hrach
Člen | 1838
+
0
-

Je to chyba,vim o ni, naprava nebude hned :/

David Matějka
Moderator | 6445
+
0
-

uz jsem to tu psal, https://forum.nette.org/…cuje-spravne

staci zapis a cteni z cache v Nette\Database\Selection (radky 116 a 417 dle aktualni verze) upravit tak, ze

<?php
$this->conditions;
?>

nahradis za

<?php
array_values($this->conditions);
?>

ono to jako klic u tech $this->conditions pouziva md5 z vstupnich argumentu fce where, takze i parametry dotazu.. nevim, jestli to nezpusobi problem nekde jinde pri slozitych dotazech, ale pouzivam tenhle fix u par projektu a vsechno funguje OK

a jeste k tomu, co se vlastne cachuje: pokud mas ten dotaz poprve pouzit, tak z databaze vytahne vsechny sloupecky.. a podle toho, ke kterym jsi pristoupil si to ulozi do cache a pak taha jen ty…

Editoval matej21 (2. 8. 2012 18:26)

hrach
Člen | 1838
+
0
-

matej21: achjo, diky, ten tvuj post sem cetl a od te doby o tom vim. Akorat me nenapadlo tak jednoduche reseni (wtf??? :D asi mi to nemysli). Diky moc :) Mam jeste nejake opravy pro cache, zkusim to dat dohromady :) Jeste jednou dekuji.

hrach
Člen | 1838
+
0
-

Fixed tu: https://github.com/…77a631e81624
= https://github.com/…-refactoring

Editoval hrach (2. 8. 2012 22:28)

frosty22
Člen | 373
+
0
-

Super díky, nyní jsem aktualizoval v jednom projektu, co se týče cache tak uvidím zda-li se soubory nebudou množit, zatím to vypadá, že nikoliv. Pouze mi to začalo hlásit chybu při přístupu k jiné tabulce, jelikož si nevytáhl v SELECTu sloupec s cizím klíčem. Vyřešil jsem to explicitním napsáním sloupců do metody SELECT.

<?php
$items = $this->connection->table("item")
					->where("item.state = ?", 1)
					->where("web.removed = ?", 0)
					->where("web.authorized = ?", 2)
					->where("item.fixed_state", 1);

// Zde ještě získávám počet $item->count() pro paginator, a následně předávám $items do šablony
?>
{foreach $items->select("item.*") as $item}
{var $additional = $item->ref("type_discount")}
 ... zde je $additional = false, pokud nezavolám select("item.*"), potom to vrací správně objekt
{/foreach}

PS: Cache jsem samozřejmě vždy vymazal, čili zde problém není

Editoval frosty22 (7. 8. 2012 16:43)

hrach
Člen | 1838
+
0
-

Mohl by si prosim zalozit nove vlakno a napsat tam ten dotaz, ktery to hlasil + pripadne dalsi dotazy, ktery maji stejne podminky (a chteji zase jine sloupce)? diky