vytváranie cache – Fatal Error

miro_r
Člen | 22
+
0
-

Zdravím, niekoľko desiatok krát za deň mám v exception log takýto záznam:

Fatal Error: Maximum execution time of 120 seconds exceeded in /var/…/vendor/nette/caching/src/Caching/Storages/FileStorage.php:306 @

Max.execution time v php.ini som nastavoval z 30 na 60 potom na 120 ale nepomohlo. Stránky z logu sa mi normálne načítajú ale niekedy návštevníkom podľa logu nie. Čo by to mohlo byť ?

miro_r
Člen | 22
+
0
-

Riadok 306 v FileStorage.php zistuje velkost nacacheovaneho suboru. Pozrel som do database cache a adresar obsahoval cez 4 000 000 suborov a ubuntu malo problem vobec vylistovat ich. Predpookladam, ze pri poziadavke na udaje o subore operacny system neodpovedal dlhu dobu.
Vyriesil som to vymazanim vsetkychnsuborov starsich ako den a takisto nastavenim cron-u aby bolo toto mazanie spustane na dennej baze. Zatial sa exception neopakovala.
Myslel som, ze nette nejako spravuje subory v cache ale boli tam subory aj 200 dni stare od zaciatku prevadzky webu a stale sa nemazali.

Marek Bartoš
Nette Blogger | 1274
+
0
-

Cache neexpiruje, jestliže ji tak nenastavíš.

miro_r
Člen | 22
+
0
-

Marek Bartoš napsal(a):

Cache neexpiruje, jestliže ji tak nenastavíš.

Prosím Ťa, kde to môžem nastaviť konkrétne pre tento prípad (db výsledky) ?

miro_r
Člen | 22
+
0
-

Pred pár dňami si google povedal, že mi zaindexuje poriadne web a začal som mať desaťnásobné návštevy ako predtým. Bohužiaľ mazanie cache súborov už nestačí, za deň mi tam robí okolo 500 000 súborov, čo nette database cachuje výsledky.

Nikdy som cache nikde nenastavil, takže je to nejako default nastavené. Je možné vypnúť cachovanie výsledkov z DB ? Nette Database si cacheuje štruktúru databázy, to aby ostalo ale aby pri každom dotaze na databázu (ktorých sú tisíce za minútu, db mám rozsiahlu), nevytváralo súbory v /temp/cache/_Nette.Database.9be879d6.......

Napadá niekoho, ako to vypnúť ?

miro_r
Člen | 22
+
0
-

Ešte doplním, DB je v PostGre a ten má dostatočné nástroje na cachovanie, aby dával výsledky. Vytváranie súborov z dotazmi DB, čo robí Nette, len celý web spomaľuje.

Marek Bartoš
Nette Blogger | 1274
+
0
-

Už ti rozumím. Nekešuješ výsledky dotazů, ale Nette ti opakovaně generuje cache pro metadata. Metadata by se měla stáhnout a zakešovat jen jednou. Měl bys zkusit zjistit, proč se cache nepoužije.

miro_r
Člen | 22
+
0
-

Nie metadáta, ale nette cachuje výsledky dotazov. Nehovorím, že ich nepoužije, možno áno, ak dvaja návštevníci otvoria zrovna rovnakú stránku po sebe, ale je to málo pravdepodobné, lebo málokedy sa opakujú.
Ale tých výsledkov sú milióny (tabuľky v DB majú milióny riadkov). Potrebujem vypnúť cachovanie výsledkov z DB. Proste po každom "SELECT .. FROM " si nette urobí súbor a ja chcem, aby si neurobilo, lebo to je kontraproduktívne.

Marek Bartoš
Nette Blogger | 1274
+
+1
-

Asi máš pravdu, nějaká cache se předává z Explorer do Selection. Můžeš ji zkusit vypnout ve službě.

Doplň správný název služby a když ti nebude fungovat cacheStorage: null, tak zkus variantu s MemoryStorage

services:
	database.<nazevDatabaze>.explorer:
		arguments:
			cacheStorage: null
			#cacheStorage: Nette\Caching\Storages\MemoryStorage()
miro_r
Člen | 22
+
0
-

Dík, pomohlo.

Pri database.<nazevDatabaze>.explorer: síce písalo chybu ale použil som:

database.default.context:
        arguments:
            cacheStorage: Nette\Caching\Storages\MemoryStorage()

a nezmyselné súbory sa prestali vytvárať.

Editoval miro_r (15. 5. 2022 14:01)

David Matějka
Moderator | 6445
+
0
-

Tolik cache souborů by nette nikdy nemělo vygenerovat. Ukaž, jak skladáš dotazy. Neslepuješ někde ve where stringy?

miro_r
Člen | 22
+
0
-

David Matějka napsal(a):

Tolik cache souborů by nette nikdy nemělo vygenerovat. Ukaž, jak skladáš dotazy. Neslepuješ někde ve where stringy?

pred pár minutami som zrovna našiel môj problém :

https://forum.nette.org/…to-debugovat

Áno máš pravdu. Dnes som pozrel a zasa vytvorených strašne veľa súborov a to napriek tomu, že mám nastavené MemoryStorage – aj tak sa vytvorí do cache s názvov Database (nie Structure) veľa súborov.

Ten najčastejší dotaz som poriešil, že namiesto select -> where používam rovno ->query.

Mám špecifickú situáciu, používam niečo takéto vo filtri ->where('ds IN ('.$dsgroup.')') . Keď to nahradím placeholderom ?, tak to nette nevie správne spracovať, dá ten zoznam ds do uvodzoviek. V $dsgroup mám urobený zoznam, napr. 12,15,18 .

Editoval miro_r (17. 5. 2022 16:28)

Kamil Valenta
Člen | 820
+
+1
-

miro_r napsal(a):
Mám špecifickú situáciu, používam niečo takéto vo filtri ->where('ds IN ('.$dsgroup.')') . Keď to nahradím placeholderom ?, tak to nette nevie správne spracovať, dá ten zoznam ds do uvodzoviek. V $dsgroup mám urobený zoznam, napr. 12,15,18 .

$selection->where('ds', explode(',',$dsgroup));
miro_r
Člen | 22
+
0
-

Kamil Valenta napsal(a):

miro_r napsal(a):
Mám špecifickú situáciu, používam niečo takéto vo filtri ->where('ds IN ('.$dsgroup.')') . Keď to nahradím placeholderom ?, tak to nette nevie správne spracovať, dá ten zoznam ds do uvodzoviek. V $dsgroup mám urobený zoznam, napr. 12,15,18 .

$selection->where('ds', explode(',',$dsgroup));

Dík, funguje.