Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczenie przed usunieciem danych z pliku
Forum PHP.pl > Forum > PHP
dublinka
Witam,
Na wstepie chce sie przywitac.

Problem pojawia sie kiedy dostep do pliku ma wiecej niz jeden user w tym samym momencie (nie czesto to jest ale zawsze moze byc a kiedys juz tak mialam).Za przyklad moze posluzyc nam licznik ktory zostanie wtedy wyzerowany.
Ktos ma jakis pomysl na to questionmark.gif
CuteOne
Osobny plik dla każdego użytkownika lub grupowanie uzytkowników na tych co mogą zapisywać/kasować pliki i na tych co mogą jedynie je odczytywać...?
dublinka
To jest wyjscie ale nie o to chodzi konkretnie.Zalozmy ze prawa sa dla kazdego takie same - jak leci jest zapis.To moze jest szukanie dziury w calym ale jak to obejsc bo zapis do jednego pliku np. licznika wywola taki efekt lub cokolwiek innego tzn dane prowadzone np. plik jako baza dla danych np. ksiazki danych.Wiem ze sa do tego bazy ale tak wlasnie do plikow sie doczepiam closedeyes.gif

Mam niby wyjscie dla tego ale nie wiem czy nie zbyt toporne:
Ustawic plik .tmp w dowolnej sciezce...
Najpierw sprawdzenie czy tenze plik istnieje, jesli nie to ustawic i zapisywac dane, pozniej usunac.Jesli user nr 2,3,4,34..bedzie probowal zapisu i plik .tmp bedzie znajdowal sie to np. przeladowac strone lub dac sleep na ilestam.

Tylko nie wiem czy to nie jest topornym rozwiazaniem i szukam innych wstydnis.gif
maniutek08
Może napisz co konkretnie chcesz uzyskaćquestionmark.gif nad jakim projektem siedzisz??
CuteOne
1. Naucz się poprawnie pisać po polsku bo to co napisałaś woła o pomstę do nieba
2. Zamiast kombinować z .tmp wystarczy nadać plikom przedrostki np.
- plik otwarty przez użytkownika ma przedrostek 'close_'
- plik nieużywany 'open_'

  1. $file = 'plik.txt';
  2. $zapis = (file_exists('open_'.$file)) ? true : false;
  3.  
  4. if($zapis) {
  5.  
  6. // zmiana nazwy pliku tak aby inni nie mogli w nim nic zapisać
  7. rename('open_'.$file, 'close_'.$file);
  8.  
  9. /* tutaj jakieś działania */
  10.  
  11. // kod zapisu
  12. file_put_contents('close_'.$file, 'efewfwf');
  13.  
  14. //na końcu ponowna zmiana nazwy pliku
  15. rename('close_'.$file, 'open_'.$file);
  16. }
  17. else { // tylko odczyt
  18.  
  19. $content = file_get_contents('close_'.$file);
  20. }


Niedogodnością takiego rozwiązania jest przerwanie działania skryptu a co za tym idzie plik nie zmieni nazwy z 'close_' na 'open_' smile.gif
Noidea
Cytat
Ustawic plik .tmp w dowolnej sciezce...
Najpierw sprawdzenie czy tenze plik istnieje, jesli nie to ustawic i zapisywac dane, pozniej usunac.Jesli user nr 2,3,4,34..bedzie probowal zapisu i plik .tmp bedzie znajdowal sie to np. przeladowac strone lub dac sleep na ilestam.

flock - domyślnie zatrzyma wykonywanie skryptu do czasu, aż inny proces nie zwolni blokady na pliku. Jeśli użyjesz flagi LOCK_NB, skrypt nie będzie blokowany a funkcja od razu zwróci true lub false
dublinka
Cytat(Noidea @ 17.09.2011, 16:23:33 ) *
flock - domyślnie zatrzyma wykonywanie skryptu do czasu, aż inny proces nie zwolni blokady na pliku. Jeśli użyjesz flagi LOCK_NB, skrypt nie będzie blokowany a funkcja od razu zwróci true lub false

nic nie ma sie to do praktyki bo uwierz mi wiem co to flock smile.gif
Noidea
Działanie flocka jest równoważne z twoim pomysłem na użycie pliku .tmp. Tyle że jest to rozwiązanie prostsze i pozbawione kilku błędów, np:
- proces 1 sprawdza czy plik .tmp istnieje => nie istnieje
- proces 2 sprawdza czy plik .tmp istnieje => nie istnieje
- proces 1 tworzy plik .tmp

Napisz dokładnie co chcesz osiągnąć i dlaczego flock nie sprawdzi się w przypadku twojego problemu
Fifi209
Dlatego używa się baz danych. ;]
dublinka
Cytat(Noidea @ 18.09.2011, 07:31:06 ) *
Napisz dokładnie co chcesz osiągnąć i dlaczego flock nie sprawdzi się w przypadku twojego problemu

Nic nie chce osiagnac tylko obejsc blad ktorym jest wariowanie parsera poniewaz jesli dostep do pliku nastepuje dwukrotnie (i tutaj nie pomoze flock uwierz mi) wlasnie parser glupieje i domyslnie wstawia 0.
Do autora powyzej.
Tutaj mowa o pliku nie bazie jesli nie doczytales jeszcze.

Tematow jest sporo np tutaj
http://forum.ks-ekspert.pl/topic/133134-ph...od-obciazeniem/
Noidea
Cytat
Nic nie chce osiagnac tylko obejsc blad ktorym jest wariowanie parsera poniewaz jesli dostep do pliku nastepuje dwukrotnie (i tutaj nie pomoze flock uwierz mi) wlasnie parser glupieje i domyslnie wstawia 0.

Widzę, że cie nie przekonam, że flock załatwi sprawę. W takim razie sama będziesz musiała to sprawdzić. Użyj ApacheBench - fajne narzędzie do sprawdzania jak zachowuje się skrypt pod obciążeniem, dostarczane razem z serwerem Apache (ab.exe w folderze bin). Zasymuluj 100 użytkowników wykonujących przynajmniej 50000 rządań takim poleceniem
Kod
ab.exe -n 50000 -c 100 localhost/test_licznika.php

Przetestuj tym sposobem kod z forum KS, oraz mój kod:
  1. <?php
  2.  
  3. if( !file_exists( "licznik.txt" ) )
  4. {
  5. $fp = fopen( "licznik.txt", "w+" );
  6. }
  7. else
  8. {
  9. $fp = fopen( "licznik.txt", "r+" );
  10. }
  11. // Powyższe linijki można zastąpić jedną:
  12. // $fp = fopen( "licznik.txt", "c+" );
  13.  
  14. flock( $fp, LOCK_EX );
  15.  
  16. $licznik = fread( $fp, 4096 );
  17. fseek( $fp, 0 );
  18. fwrite( $fp, $licznik + 1 );
  19.  
  20. flock( $fp, LOCK_UN );
  21. fclose( $fp );
  22.  
  23. ?>

i sprawdź jaka liczba pojawi się w pliku licznik.txt


Jeśli kod z funkcją file_put_contents( "plik.txt", $wartosc, LOCK_EX ) nie daje poprawnego wyniku, to znaczy, że funkcja ta została źle napisana (Blokada jest nakładana przed zapisem, ale po wyczyszczeniu zawartości pliku, więc nie należy na niej polegać w 100%. Cóż, uroki PHP...)
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.