Autor | Zpráva | ||
---|---|---|---|
Darker Profil |
#1 · Zasláno: 11. 7. 2012, 16:49:29
Jde nějak zjistit, že je soubor otevřen a jiný skript ho používá? Mám skript, který nesmí běžet dvakrát a zároveň by měl běžet non-stop. Kontrolo vytvořením prázdného souboru je nedostatečná - pokud skript spadne v průběhu, bude to vypadat, že pořád běží.
Skript má ale log, který si na začátku otevře a připisuje do něj hodnoty. Jde tedy zjistit, že se do logu zapisuje? |
||
Jenicek Profil |
#2 · Zasláno: 11. 7. 2012, 16:52:36
to patří do php?
podle času logu se to zjistit dá... |
||
Darker Profil |
#3 · Zasláno: 11. 7. 2012, 17:08:54
Jenicek:
„to patří do php?“ Vzhledem k tomu, že jde o PHP skript, tak ano, patří. Pro lepší porozumnění moje představa: if(soubor_je_otevreny("log.txt")) die("Skript zrovna bezi"); $log = fopen("log.txt") for($i=0; $i<5; $i++) { fwrite($log, "Radek\n"); sleep(1); } fclose($log); |
||
Keeehi Profil |
#4 · Zasláno: 11. 7. 2012, 17:21:45
Darker:
Soubor by se měl dát nechat zamknout a to zamknutí se dá otestovat. Nevím ale, co se stane s tím souborem, pokud je program násilně ukončen. IMHO se odemkne, ale bylo by to potřeba vyzkoušet. |
||
Darker Profil |
#5 · Zasláno: 11. 7. 2012, 18:22:33 · Upravil/a: Darker
Keeehi:
„IMHO se odemkne“ Ba PHP net píšou, že od verze 5.něco už ne, takže asi zůstane zamčený klidně napořád. „a to zamknutí se dá otestovat.“ Píšou, že takhle: if(!flock($log, LOCK_EX)) { file_put_contents("error",""); //Nevidím běh programu, proto tohle exit; } Zkoušel jsem to s tímto skriptem: http://u8.8u.cz/flock.php <?php header("Content-Type: text/plain; charset=utf-8"); echo "PHP verze ".phpversion(); $log = fopen("text.txt",'a'); if(!flock($log, LOCK_EX)) { echo "Soubor je uzamčen."; exit; } ignore_user_abort (true);ob_start(); echo "Zamykám a zapisuji.\n"; header("Content-Length: ".ob_get_length()); header("Connection: close"); ob_end_flush();ob_flush();flush(); //Odtud už skript běží ačkoliv stránka je načtená. Komunikace zkončila fwrite($log, "Zápis: ".date("j.n. G:i:s")); sleep(5); fflush($log); flock($log, LOCK_UN); fclose($log); echo "Konec."; //Nikdy se nezobrazí A vynechání odemykání souboru taky nefunguje. |
||
Časová prodleva: 13 let
|
0