Nette Cache maximum execution time
- Hitny14
- Člen | 90
Ahoj,
na projektech používáme Cache
ve verzi
3.1.3 pomocí FileStorage
. Na jednom projektu
který má celkem dost dat, jsme objevili v error.log celkem často se
opakující se chyby:
Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:306
Chyba která je je metodě readMetaAndLock()
konkrétně
v otevření souboru $handle = @fopen($file, 'r+b');
Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:313
Taky v metodě readMetaAndLock()
při získání velikosti
streamu $size = (int) stream_get_contents($handle, self::MetaHeaderLen);
Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:315
Taky v metodě readMetaAndLock()
při načtení streamu
$meta = stream_get_contents($handle, $size, self::MetaHeaderLen);
Přijde mi to jako kdyby se systém snažil načíst nějaký moc velký soubor s uloženou cache ale nemůžu vůbec zjistit o který soubor se jedná a ani se mi to nijak nedaří nasimulovat.
A další tři chyby jsou ve metodě clean()
která se volá
pokud jsem to pochopil správně pouze pokud so jí někde zavolám pomocí
$this->cache->clean()
Což v mám případě používám
pouze při invalidaci pomocí Tagu viz příklad:
$this->cache->clean([
Cache::Tags => ['cart']
]);
A v tomto případě se nikdy nedostanu do větve odkud jsou následují
chyby. A další připad kde se volá metoda clean()
je
v constructoru FileStorage.php
kde ze volá pokud nastane tato
podmínka:
if (mt_rand() / mt_getrandmax() < static::$gcProbability) {
$this->clean([]);
}
Čehož se mi nepodařilo do cílit.
Fatal Error: Maximum execution time of 30 seconds exceeded in
/var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:243
Fatal Error: Maximum execution time of 30 seconds exceeded in
/var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:244
Tyto dvě chyby nastanou na tom to místě:
foreach (Nette\Utils\Finder::find('_*')->from($this->dir)->childFirst() as $entry) {
$path = (string) $entry;
Jediné co mě napadá je, že se systém snaží načíst moc souborů
pomocí Nette\Utils\Finder::find('_*')->from($this->dir)->childFirst()
A poslední chyba je
Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:259
která je na místě:
if ((!empty($meta[self::MetaDelta]) && filemtime($meta[self::File]) + $meta[self::MetaDelta] < $now)
|| (!empty($meta[self::MetaExpire]) && $meta[self::MetaExpire] < $now)
) {
$this->delete($path, $meta[self::Handle]);
continue;
}
Což nastane při invalidaci pomocí souboru. Tuto invalidaci mám použitou nejčastěji. Jen se mi prostě nedaří přijít na to proč se tomu tak děje.
Děkuji moc za každou radu popřípadě nějaké vysvětlení.
- Matúš Matula
- Člen | 257
mam podobne problemy na viacerych serveroch, ako pise @MajklNajt tak asi to bude nejake I/O zahltenie, nepodarilo sa mi to nijak blizsie detegovat. Na 1 serveri sme presli z virtualky na dedikovany, teda sme uz nezdielali ssd s nikym a tieto logy zmizli. Je to ale neprijemne, pretoze mame stroje, na kt. udajne nic podstatne nebezi cely cas a napriek tomu narazame na tento problem..
keby sa to podarilo niekomu vyriesit, viac ludi to oceni :)
- Pavel Kravčík
- Člen | 1195
Nám se to aktuálně děje v PHP82, ale nesouvisí to s Nette. Při určitých procesech uživatel přijde o všechny php-fpm. Při downgrade na PHP8.1 to funguje v pohodě se zdá, ale je to nárazový problém. V Laravelu se to děje stejně. Dokážeme to replikovat paralelním nahráváním souborů přes ajax, v Laravelu to replikovat zatím nedokážou.