[PHP] założenie blokady na plik


(felixik) #1

Witam, tworząc edytor plików napotkałem na pewien problem. Otóż chciałbym ustrzec się sytuacji, że dwie osoby próbują w jednym momencie edytować ten sam plik. Poczytałem trochę i próbowałem założyć blokadę na plik za pomocą flock. Jednak za groma nie chce mi to działać. Czy mógłby ktoś pomóc i podpowiedzieć bądź poprawić poniższy kod

treść błędu:

Warning: flock() expects parameter 1 to be resource, string given in /home/c/h/o/chojnowski/www/edytor.php on line 108

<?php

$tab1 = array('
', '', '');

$tab2 = array("", "", '<?php', '?>');

if (empty($_GET['strona']))

{

echo' tekst informacyjny';

}

else

{

echo'';

flock ("".$dir.$_GET['strona'].".".$typ_pliku."", 2);

$a = file_get_contents("".$dir.$_GET['strona'].".".$typ_pliku."");


if (flock) { echo ''; }


  echo $a;

  echo '
';

  echo '';

  $editor_data = stripslashes($_POST['content']);

  $editor_data = str_replace($tab1, $tab2, $editor_data);

  $editor_data = html_entity_decode($editor_data);

  $b = file_put_contents("".$dir.$_GET['strona'].".".$typ_pliku."", $editor_data);

echo'';


}

?>

Z góry dziękuję


(Oustish) #2

flock() przyjmuje jako parametr uchwyt do pliku. Żeby go zdobyć musisz otworzyć plik za pomocą fopen(), np. tak:

$handle = @fopen($path, "rb");

if($handle) {

     flock($handle, LOCK_EX);

}

else {

     // błąd, plik nie istnieje lub jest zablokowany za pomocą flock()

}

Inna sprawa, czy to wciąż będzie działać po zakończeniu wykonywania skryptu. Według manuala:

Jeżeli ma to działać na wielu wersjach PHP, potrzeba innej metody dla blokowanie dostępu do pliku.


(felixik) #3

Prawie działa, ale informacja o otwarciu pliku pokazuje się na stałe a nie w momencie zdublowanego otwarcia pliku. Najpewniej pomyliłem coś w IF-ach. Pomożecie? :slight_smile:

<?php

$tab1 = array('
', '', '');

$tab2 = array("", "", '<?php', '?>');

$path = "".$dir.$_GET['strona'].".".$typ_pliku."";

$handle = @fopen($path, "rb");


if (empty($_GET['strona']))

{

echo'

tekst informacyjny';


if($handle) {

     flock($handle, LOCK_EX);

}

else {

echo 'inf o zablokowaniu pliku';

}

}

else

{

echo'';

$a = file_get_contents("".$dir.$_GET['strona'].".".$typ_pliku."");


  echo $a;

  echo '
';

  echo '';

  $editor_data = stripslashes($_POST['content']);

  $editor_data = str_replace($tab1, $tab2, $editor_data);

  $editor_data = html_entity_decode($editor_data);

  $b = file_put_contents("".$dir.$_GET['strona'].".".$typ_pliku."", $editor_data);

echo'';

}

?>

(Konrad Kosowski) #4

Kod jest mało czytelny, ale wydaje mi się, ze problem polega na tym, że weryfikujesz wartość po fopen, która jest resorcem zawsze, gdy plik istnieje dla deamona serwera www, wiec tutaj najpewniej będziesz miał zawsze TRUE. Musisz weryfikować co Ci zwraca flock. BTW, nie polecam te funkcji, jest kapryśna. Lepiej stworzyć helpera, który będzie robił to samo, ale przy pomocy execa.


(felixik) #5

generalnie chce zrobić sprawdzanie czy dany plik jest otwarty czy nie. Jeśli jest to poinformować o tym użytkownika. Pokażesz mi przykład tej weryfikacji flock? Mam też inny pomysł mianowicie odrębną tabelę w MySQL, która trzymałaby nazwę otwartego pliku


(Konrad Kosowski) #6
= fopen('path/to/file', 'rb');flock($handle, LOCK_EX)) //blokuje do zapisu. Jeśli nie potrzebujesz zapisywać, możesz dać LOCK_SH{'Plik zablokowałem';

(felixik) #7

(Konrad Kosowski) #8

No ale panie... Czytaj przecież co masz w błędach. Pewnie ten get jest pusty.