Ochrana cache při time limit

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Scorpio
Člen | 45
+
0
-

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
+
0
-

Pokud vím, Nette cache tuto ochranu má. Ty používáš co? Něco vlastního nebo cache z Nette?

Scorpio
Člen | 45
+
0
-

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
+
0
-

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
+
0
-

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)

Scorpio
Člen | 45
+
0
-

Tak jsem to vyřešil jinak přes file_put_contents($line,FILE_APPEND | LOCK_EX); a následně při dalším spuštění scriptu přečtu soubor a nahraju ho do cache.
Tak můžete vlákno zavřít.