Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]PHP odczyt i zapis do pliku nie zwalniająć blokad flock
Forum PHP.pl > Forum > Przedszkole
matijas6113
Witam,
Głowie się troszkę z problemem. Otóż chciałem napisać funkcję, która:
1.otwiera plik
2. blokuje flock($uchwyt, LOCK_EX)
3. odczytuje dane z pliku
4. modyfikuje dane
5. zapisuje
6. dopiero teraz zwalnia blokade i zamyka plik

Jednak mam problem bo przy fopen nadając flage w+ nie mogę odczytać danych poniewaz są usuwane zanim je odczytam a przy innych flagach dane zostają w plikach i taka modyfikacja wygląda tak że w pliku są zapisane zmodyfikowane dane razem ze starymi danymi...

Jest możliwość aby odczytać i zapisać pliki przy czym zapisać je na "czysto" bez zwalniania blokad i zamykania pliku a potem otwierania pliku ponownie z inną flagą?
wewior
Oczywiście, wcześniej (na początku funkcji) czytasz plik za pomocą np funkcji file i masz cały plik w tablicy, potem otwierasz fopen w+ i plik się czyści.
Nh2003
file_get_contents
file_put_contents


matijas6113
hm ale wydaje mi się zę używając funkcji file() bądź file_get_contents wraz z file_put_contents to plik pomiędzy odzczytem a zapisem jest modyfikowalny czyli może ulec zmianie... czyli jeśli w jednym momencie będzie wygenereowany duży ruch to moze dojść do pomyłek chyba prawda? Bo pliki nie są zablokowane od momentu odczytu do zapisu tylko pomiędzy zapisem a odczytem jest luka w blokadach zgadza sie? Czy jednak operacje są na tyle szybkie ze nie dojdzie do jakiekoś wycieku danych?
Nh2003
Manual nie gryzie:

http://php.net/manual/en/function.file-put-contents.php

flags: LOCK_EX - Acquire an exclusive lock on the file while proceeding to the writing.
Crozin
Plik możesz otworzyć (fopen), odczytać jego zawartość (fread), ustawić wskaźnik na początek pliku (fseek), zapisać jakieś dane (fwrite) po czym przyciąć do odpowiedniej długości jeżeli nowa zawartość jest krótsza niż poprzednia (ftruncate). Na koniec oczywiście plik trzeba zamknąć (fclose).
Plik otwierasz tylko raz, więc nie powinno być jakiś specjalnych problemów z jego blokowaniem.

Cytat
[...] Czy jednak operacje są na tyle szybkie ze nie dojdzie do jakiekoś wycieku danych?
Nigdy nie powinieneś wychodzić z założenia, że "przerwa" jest na tyle krótka że nigdy problemów nie będzie. To jest ogólna zasada do wszystkiego związanego ze współbieżnością.
matijas6113
Oto mi chodziło;] Dziękuje bardzo;] nie zwalniam blokady a plik jest modyfikowany:D zamiast fseek użyłem rewind(). Wrzuce kod jakby ktoś szukał coś takiego
  1. $handle = fopen("plik.txt", "r+");
  2. flock($handle, LOCK_EX);
  3. $tresc = fread($handle, sizeof("plik.txt"));
  4. ftruncate($handle, 0);// czysci zawartość pliku (nie jestem pewien ale chyba zeruje bity bo w pliku tekstowym zostaje puste miejsce a dopiero za nim sa dane)
  5. rewind($handle);// przesuwam kursor na początek pliku i wtedy nie ma pustego miejsca tylko od początku pliku są dane:)
  6. $tresc .= "zmodyfikowanie ";
  7. fwrite($handle, $tresc);
  8. flock($handle,LOCK_UN);
  9. fclose($handle);


To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.