vytváranie cache – Fatal Error
- miro_r
- Člen | 22
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
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.
- miro_r
- Člen | 22
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úť ?
- Marek Bartoš
- Nette Blogger | 1274
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
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
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()
- David Matějka
- Moderator | 6445
Tolik cache souborů by nette nikdy nemělo vygenerovat. Ukaž, jak skladáš dotazy. Neslepuješ někde ve where stringy?
- miro_r
- Člen | 22
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
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
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.