Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: blokowanie dostepu do plikow
Forum PHP.pl > Forum > PHP
Artelo
Jestem tu nowy wiec chcialbym sie najpierw ze wszystkimi przywitac. Witam smile.gif

Napisalem sobie prosty skrypcik w php do zliczania wejsc na poszczegolne kategorie strony.

  1. <?php
  2.  
  3.  
  4. if(file_exists(&#092;"dupa/$kateg\")) 
  5.    { 
  6.       $file=fopen(&#092;"dupa/$kateg\", \"r\"); 
  7.       flock($file, 1);              
  8.  
  9.       $ile=fgets($file, 100); 
  10.  
  11.       flock($file, 3); 
  12.       fclose($file); 
  13.  
  14.       $ile++; 
  15.    } 
  16.    else 
  17.       $ile=1; 
  18.  
  19.    $file=fopen(&#092;"dupa/$kateg\", \"w\"); 
  20.    flock($file, 2); 
  21.  
  22.    fwrite($file, $ile); 
  23.  
  24.    flock($file, 3); 
  25.    fclose($file); 
  26.  
  27.  
  28. ?>

- nospor

W moim mniemaniu wszystko jest dobrze bo dostep do zapisu jak i odczytu jest blokowany... Jednak okazuje sie ze tak nie jest. Przy kliku tysiacach wywolan dziennie pliki w ktorych zapisane sa liczniki odmawiaja posluszenstwa. Okazuje sie ze tego typu blokowanie nie spelnia zadania i widocznie mozliwy jest rownoczesny dostep do jego zapisu co jest przyczyna problemu.

Da sie w zablokowac owe pliki w jakis inny i bardziej efektywny sposob?
Potrzebny mi porsty licznik oparty na plikach txt wiec baza danych odpada.

Bardzo prosze o pomoc.
nospor
A więc na początek: Witamy chlebem i solą.
Jesteś nowy więc nie zauważyłeś że do kodu php uzywa się odpowiedniego bbcode. Już ci poprawiłem. Na przyszłośc staraj się o tym pamiętać. Zapoznaj się również z regulaminem, aby nie było nieporozumień.

Wracając do tematu. Ja nie ufam tym flockom. Stosuje swój (niekoniecznie dobry) mechanizm. W przypadku gdy chcę się dobrać do pliku i go zablokować, tworzę drugi plik o tej samej nazwie, tylko zmieniam rozszerzenie na .lck. Gdy uznam, że plik można już odblokować, usuwam ten stworzony przezemnie.
Teraz gdy skrypt, próbuje odczytać (zapisać) plik, patrzy czy jest założony plik .lck. Jak nie ma to sam zaklada i się dobiera do pliku. Jak jest, znaczy że plik jest zablokowany i trzeba ewentualnie poczekać. Czekanie można zrealizować poprzez pętle, która np. max. 100 razy będzie sprawdzać czy plik się odblokował (zniknął .lck). Gdy tak, to wychodzi z pętli i sie do pliku dobiera, gdy nie i zostanie osiągnięta max. liczba iteracji, przerywamy próbe dobrania się do pliku i wyswietlamy jakis tam komunikat.
Ja to stosuje do sond, jakoś działa. Nie mialem problemów. Spróbuj, może i tobie to się przyda.
vala
a moze chodzi o to?smile.gif

Kod
Warning:
flock() will not work on NFS and many other networked file systems. Check your operating system documentation for more details.

On some operating systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you may not be able to rely on flock() to protect files against other php scripts running in parallel threads of the same server instance!

flock() is not supported on antiquated filesystems like FAT and its derivates and will therefore always return FALSE under this environments (this is especially true for Windows 98 users).

Dodałem bbcode. Też o tym myślałem. Dlatego też nie używam flock - nospor
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.