Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]pytanie dot. blokowania pliku tekstowefo flock
--Marecki--
post
Post #1





Goście







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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
shinuexx
post
Post #2





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


flock() pobiera wskaźnik do pliku zwrócony przez fopen() a nie nazwę pliku. (to samo jest napisane w opisie błędu)

Ten post edytował shinuexx 27.11.2011, 14:48:47
Go to the top of the page
+Quote Post
--Marecki--
post
Post #3





Goście







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?
Go to the top of the page
+Quote Post
--Marecki--
post
Post #4





Goście







Dalej nie rozumiem, co to oznacza, że pobiera wskaźnik do pliku?
Go to the top of the page
+Quote Post
--Marecki--
post
Post #5





Goście







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 ;-(
Go to the top of the page
+Quote Post
--Marecki--
post
Post #6





Goście







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
Go to the top of the page
+Quote Post
--Marecki--
post
Post #7





Goście







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?
Go to the top of the page
+Quote Post
shinuexx
post
Post #8





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


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().
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #9





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


http://en.wikipedia.org/wiki/File_locking
Go to the top of the page
+Quote Post
--Marecki--
post
Post #10





Goście







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 to the top of the page
+Quote Post
-Gość-
post
Post #11





Goście







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
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #12





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


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.
Go to the top of the page
+Quote Post
shinuexx
post
Post #13





Grupa: Zarejestrowani
Postów: 78
Pomógł: 9
Dołączył: 2.02.2011
Skąd: undefined

Ostrzeżenie: (0%)
-----


file() jest funkcją wkompilowaną w jądro PHP, więc najprawdopodobniej ma własne zabezpieczenie.
Go to the top of the page
+Quote Post
-Gość-
post
Post #14





Goście







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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 23:12