Autor Zpráva
Darker
Profil
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
to patří do php?

podle času logu se to zjistit dá...
Darker
Profil
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
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
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;
}
Mě se soubor error ale neobjevil...


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í
Skript by měl po zamčení pět sekund čekat. Bohužel ani tímhle se mi to nepovedlo otestovat - z nějakého důvodu se mi skript po daných 5 sekund nedaří znovu načíst - server mě k němu nepustí. Stejný problém jsem řešil, když jsem se snažil udělat long poling chat. (a nevyřešil)


A vynechání odemykání souboru taky nefunguje.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: