Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]pytanie dot. blokowania pliku tekstowefo flock
Forum PHP.pl > Forum > Przedszkole
-Marecki-
Czytałem, że jak 2 userów jednoczesnie wykona skrypt na pliku tekstowym, to może go uszkodzić.

1. Czy to samo dotyczy odczytywania danych z pliku tekstowego?
(tj. czy jak 2 osoby odczytają ten plik i wykonają skrypt niezapisujący nic w pliku, to też może mi rozwalić ten plik? - myślę że nie powinno, ale wolę się upewnić)

2. Co oznacza ten komunikat?
  1. Warning: flock() expects parameter 1 to be resource, string given in /home/piotr/public_html/dane/dane.php on line 33

Mam taki skrypt:

  1. $plik = 'dane.txt';
  2. flock($plik, LOCK_SH);// blokuję plik do odczytu
  3. $dane = file($plik); /* pobieram dane z pliku i zapisuje do tablicy (linia = rekord) */
  4. ..obrabiam dane...
  5. flock($plik, LOCK_UN);// odblokowanie pliku
  6. fclose($plik);//zamknięcie
shinuexx
flock() pobiera wskaźnik do pliku zwrócony przez fopen() a nie nazwę pliku. (to samo jest napisane w opisie błędu)
-Marecki-
Cytat(shinuexx @ 27.11.2011, 14:48:13 ) *
flock() pobiera wskaźnik do pliku zwrócony przez fopen() a nie nazwę pliku. (to samo jest napisane w opisie błędu)


Czy to oznacza, że jak nie robię tego poprzez fopen, tylko wczytuję do tablicy przez $dane = file($plik); to nie muszę się obawiać uszkodzenia pliku?
-Marecki-
Dalej nie rozumiem, co to oznacza, że pobiera wskaźnik do pliku?
-Marecki-
tj. jaki mam podać wskaźnik, skąd go wziąć? myślałem że podaję nazwę pliku i jak go zablokować - np. do odczytu, czy zapisu, a Ty piszesz o jakimś wskaźniku - nie kumam i nie mogę nigdzie znaleźć odpowiedzi ;-(
-Marecki-
Czy to ma być tak?


  1. $plik = fopen("dane.txt", "r"); // r to chyba ten wskaźnik o który Ci chodzilo: read
  2. flock($plik, LOCK_SH);// blokuję plik do odczytu
  3. $dane = file($plik); /* pobieram dane z pliku i zapisuje do tablicy (linia = rekord) */
  4. ..obrabiam dane...
  5. flock($plik, LOCK_UN);// odblokowanie pliku
  6. fclose($plik);//zamknięcie
-Marecki-
Może zapytam inaczej, czy otwierając plik do tablicy poprzez
  1. $dane = file($plik);
można założyć blokadę na ten plik celem zabezpieczenia go przed utratą danych, w chwili gdyby 2 userów jednoczesnie chciało wykonać skrypt?
shinuexx
problem uszkodzenia pliku występuje tylko w momencie próby zapisania do pliku. Podczas odczytu ten problem nie występuje(jeśli się mylę to niech mnie ktoś poprawi). A co do twojego skryptu to nie ma potrzeby otwierania pliku funkcją fopen() (odsyłam do manuala, są tam opisane funkcje) jeśli czytasz zawartość pliku poprzez file().
wNogachSpisz
http://en.wikipedia.org/wiki/File_locking
-Marecki-
Na tej stronie Wikipedii przedstawiono problemy związane z brakiem blokowania pliku, m.in.

"Process A reads a customer record from a file containing account information, including the customer's account balance and phone number."

Nie znam zbytnio angielskiego, ja to czytam:

Proces A czyta rekord klienta z pliku zawierającego informacje o koncie, włączając balans kont klientów i numerów telefonów.

To nie ma sensu - wie ktoś co to znaczy?
Gość
Czy mam rozumieć, że php ma funkcję
wczytującą plik do tablicy, ale nie można w jej zabezpieczyć pliku przed utratą danych?

Bez sensu, to po co taka funkcja, jeśli jest niebezpieczna. Nie mogę uwierzyć, żeby flock nie działało z file($plik)


  1. $plik = 'dane.txt';
  2. flock($plik, LOCK_SH);// blokuję plik do odczytu
  3. $dane = file($plik); /* pobieram dane z pliku i zapisuje do tablicy (linia = rekord) */
  4. ..obrabiam dane...
  5. flock($plik, LOCK_UN);// odblokowanie pliku
  6. fclose($plik);//zamknięcie
wNogachSpisz
Cytat(-Marecki- @ 28.11.2011, 22:01:55 ) *
Na tej stronie Wikipedii przedstawiono problemy związane z brakiem blokowania pliku, m.in.

"Process A reads a customer record from a file containing account information, including the customer's account balance and phone number."

Nie znam zbytnio angielskiego, ja to czytam:

Proces A czyta rekord klienta z pliku zawierającego informacje o koncie, włączając balans kont klientów i numerów telefonów.

To nie ma sensu - wie ktoś co to znaczy?

Wyrwane z kontekstu nie znaczy nic.
Nie znasz angielskiego? Nie masz czego szukać w świecie IT.
shinuexx
file() jest funkcją wkompilowaną w jądro PHP, więc najprawdopodobniej ma własne zabezpieczenie.
Gość
Cytat(shinuexx @ 28.11.2011, 22:14:40 ) *
file() jest funkcją wkompilowaną w jądro PHP, więc najprawdopodobniej ma własne zabezpieczenie.



Czyli nie powiniemem się przejmować zablokowaniem pliku przed odczytem?

Nigdzie w necie nie mogę tego znaleźć, bo wszyscy opisują otwarcie poprzez
  1. $fp = fopen("test.txt", "r");
, a o
  1. $plik = implode('', file('nazwa_pliku'));
tylko wspominają mimochodem
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.