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í.