flock a odczyt przez serwer

0

Jeśli ustawię sobie na pliku:

flock($plik, 2);

To próba czytania go nic nie zwróci, np:

$tresc = file_get_contents('test.txt');

To rozumiem i widzę, że można to jakoś ogarnąć, sprawdzając stan pliku przed odczytem.


A co zrobić w sytuacji, gdy modyfikuję sobie właśnie plik, a jednocześnie istnieje możliwość, że w tym samym czasie, ktoś zażąda do niego dostępu przez serwer, wpisując w przeglądarce:
domena.jakaśtam/test.txt
Z testów mi wychodzi, że żadne flock nie blokuje serwerowi dostępu do pliku.

  • Czy jest zatem możliwe, że plik zostanie zmodyfikowany w trakcie odczytywania przez serwer i użytkownik dostanie niespójny ciąg danych?
  • Jeśli tak, to czy istnieje jakaś metoda zabezpieczenia się przed tym prostsza niż żeby zamiast wywoływania pliku TXT, wywołać plik PHP, który to dopiero odczyta sobie ten TXT i wyświetli użytkownikowi, lub ew. wyświetli info, że plik jest właśnie modyfikowany?
0

A to nie będzie tak, że użytkownik ma to w swoim cashu, i jak już ma otworzone to już nic na to nie poradzisz? Można spróbować zablokować próbę wejścia już od chwili modyfikacji, zmienić choćby chmoda pliku tylko dla siebie. Tylko Ci co już wczytali i tak będą mieli załadowane.

0

@youmound:

A to nie będzie tak, że użytkownik ma to w swoim cashu, i jak już ma otworzone to już nic na to nie poradzisz?

Plik jest wywoływany z uniksowym licznikiem sekund jako parametrem, więc zawsze wchodzi od nowa.

zmienić chmoda

Dzięki za pomysł :)

1

Ja zrobiłem to u siebie tak, że pobieram plik, modyfikuję go i zapisuję pod nową nazwą.
Przed zapisem sprawdzam, czy taki plik (o tej nowej nazwie) istnieje. Jeśli istnieje, tzn. że ktoś właśnie edytuje i zapisał przed chwilą.
W tej sytuacji możemy ewentualnie wstrzymać zapis, albo podjąć jakieś inne działania.
Po zapisaniu i zamknięciu pliku sprawdzam, czy zapis się powiódł (można pobrać plik ponownie i sprawdzić, czy zawartość pliku jest taka sama, jak to co zapisywaliśmy), albo oprzeć się na wartościach zwracanych przez funkcję zapisująca i zamykająca plik.
I jeśli jest ok, to rename. (Ja dla bezpieczeństwa najpierw jeszcze zmieniam nazwę plikowi oryginalnemu dodając mu do nazwy kolejne liczby. W ten sposób mam historię edycji).

1 użytkowników online, w tym zalogowanych: 0, gości: 1