Ochrana cache při time limit
- Scorpio
- Člen | 45
Zdravím,
řeším jeden zapeklitý problém. Mám jeden celkem složitý script který
zpracovává velké množství záznamů z XML, využívám cache abych si
určil kde v souboru jsem, často se stane že script nedoběhne v časovém
limitu a poté z cache načtu kde jsem skončil a pokračuji dál.
Vše fungovalo výborně až do okamžiku kdy jsem do cache ukládal pozici
v souboru cca 40000 položek. V tu chvíli se mi často stalo že časový
limit vypršel při ukládání cache. Tak jsem při opětovném spuštění
začal od 0. Je nějaký způsob jak jednoduše ochránit soubor s cache aby
se nepřemazal dokud není správně uložen ten nový aktuální?
Pracuji ještě s CMS OpenCart a tam taková cache je při každém uložení
se vytvoří nový soubor a ten původní se smaže. V případě že při
ukládání dojde k chybě a jsou tam soubory uloženy dva tak se mi vybral ten
starší.
- petr.pavel
- Člen | 535
Pokud vím, Nette cache tuto ochranu má. Ty používáš co? Něco vlastního nebo cache z Nette?
- Scorpio
- Člen | 45
Mam Nette 2.2.3 a používam přímo tu v nette.
běží mi foreach kde na konci foreache vždy aktualizuji hotové řádky.
Ale když mi někdy vyprší limit a kouknu do složky kde se cache ukladá
najdu tam často soubory s 0 velikostí. Takže jsem z toho usoudil, že se
script přerušil při ukladání nehledě na to že v logu exception mam
[2014-09-18 07-06-03] Fatal error: Maximum execution time of 90 seconds exceeded in /vendor/nette/caching/src/Caching/Storages/FileStorage.php:213 @ http://---.cz/cron/ex @@ exception-2014-09-17-21-04-55-7ed0b53af590ac92175876517e2baeb6.html
- iguana007
- Člen | 970
Vidím, že v URL máš „cron“ – tak to spouštěj jako cron v command lajně a toto se ti stávat nebude, protože cli skripty mají max_execution_time nastavený defaultně na 0 == tj. není tam časový limit – pokud tu možnost nemáš, tak si ten max_execution_time prodluž na nějakou delší dobu, viz.: http://stackoverflow.com/…e-in-php-cli
- Scorpio
- Člen | 45
Bohužel ani jedno nemohu jelikož se jedná o webhosting u wedosu.
Veškerá manipulace s max_execution_time je zakázána.
Když to zapínam na localhostu a vypnu limit tak i tak se obcas stane ze to
nejak zahadně vyprší (operace občas trvá déle než 30 min) ale to bych
viděl že dojde paměť nebo něco podobnýho. Řeším tam teď funkci která
by detekovala blížící se konec a ukončila script předčasně než se
začne ukládat cache.
$max_time = (ini_get('max_execution_time') - 5);
foreach(...){
if (\Tracy\Debugger::timer('cron') > $max_time) {
echo "exceeded the time limit";
exit;
}
}
Editoval Scorpio (18. 9. 2014 9:40)