Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zabezpieczenie przed usunieciem danych z pliku
dublinka
post 17.09.2011, 14:33:14
Post #1





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

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


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


--------------------
Go to the top of the page
+Quote Post
CuteOne
post 17.09.2011, 14:40:51
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


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ć...?
Go to the top of the page
+Quote Post
dublinka
post 17.09.2011, 14:52:40
Post #3





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

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


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


--------------------
Go to the top of the page
+Quote Post
maniutek08
post 17.09.2011, 15:19:35
Post #4





Grupa: Zarejestrowani
Postów: 107
Pomógł: 1
Dołączył: 23.08.2009

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


Może napisz co konkretnie chcesz uzyskaćquestionmark.gif nad jakim projektem siedzisz??
Go to the top of the page
+Quote Post
CuteOne
post 17.09.2011, 15:27:50
Post #5





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


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

Ten post edytował CuteOne 17.09.2011, 15:31:24
Go to the top of the page
+Quote Post
Noidea
post 17.09.2011, 16:23:33
Post #6





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


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


--------------------
Go to the top of the page
+Quote Post
dublinka
post 17.09.2011, 17:38:12
Post #7





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

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


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

Ten post edytował dublinka 17.09.2011, 17:38:29


--------------------
Go to the top of the page
+Quote Post
Noidea
post 18.09.2011, 07:31:06
Post #8





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


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


--------------------
Go to the top of the page
+Quote Post
Fifi209
post 18.09.2011, 09:11:00
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Dlatego używa się baz danych. ;]


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
dublinka
post 18.09.2011, 11:11:36
Post #10





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

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


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/


--------------------
Go to the top of the page
+Quote Post
Noidea
post 18.09.2011, 13:37:34
Post #11





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


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...)


--------------------
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 Wersja Lo-Fi Aktualny czas: 26.06.2025 - 18:16