Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Tryb odczytu pliku DBF
Forum PHP.pl > Forum > Przedszkole
miniol
Mam takie pytanie. Otwieram za pomocą php plik DBF. I teraz pytanie- Jeśli plik jest otwierany tylko w trybie odczytu, to na jak długo jest on blokowany? Czy jest on blokowany do momentu wywołania dbase_close, czy tylko do momentu kiedy cały plik zostanie wczytany do pamięci? A może przy odczycie w ogóle nie jest blokowany?
Crozin
1. Dokumentacja jest uboga, więc piszę w oparciu o bardzo pobieżne zerknięcie na źródła.
2. Plik nie jest w ogóle wczytywany do pamięci - operacje odczytu/zapisu danych są wykonywane zawsze bezpośrednio na pliku, tak więc jeżeli jakakolwiek blokada jest zakładana na plik zostanie ona zdjęta w momencie wywołania dbase_close.
3. Wykonaj prosty test:
  1. <?php
  2.  
  3. $dbase = dbase_open('...', 0);
  4. if ($dbase === false) {
  5. die('Błąd...');
  6. }
  7.  
  8. sleep(20);
  9. dbase_close($dbase);
Odpal ten skrypt, a zaraz po tym odpal go jeszcze raz - równolegle.
miniol
Nie wyświetliło mi błędu kiedy uruchomiłem kilka zakładek jednoscześnie, więc rozumiem, że plik w ogóle nie jest blokowany w tym czasie?

Edit: Ale właśnie zrobiłem test dając odczyt i zapis. Również nie wyświetlił mi żadnego błędu. Ale spróbowałem w trakcie wykonywani skryptu zmienić nazwę pliku i nie mogłem (zarówno podczas odczytu jaki zapisu). To chyba oznacza, że jednak pliki są blokowane.
Crozin
Cytat
Nie wyświetliło mi błędu kiedy uruchomiłem kilka zakładek jednoscześnie, więc rozumiem, że plik w ogóle nie jest blokowany w tym czasie?
Na to by wyglądało.
Cytat
Ale właśnie zrobiłem test dając odczyt i zapis. Również nie wyświetlił mi żadnego błędu.
Zdajesz sobie sprawę z tego, że ta baza jest kompletnie nieprzygotowana do pracy z wieloma zapisami na raz - wewnętrzna struktura bazy może zostać uszkodzona w takim przypadku.
Cytat
Ale spróbowałem w trakcie wykonywani skryptu zmienić nazwę pliku i nie mogłem (zarówno podczas odczytu jaki zapisu). To chyba oznacza, że jednak pliki są blokowane.
Nie są blokowane, są po prostu otwarte (przez skrypt), a jak zapewne wiesz, plik który jest otwarty przez jakiś program nie może mieć zmienionej nazwy albo zostać usuniętym.
miniol
Cytat(Crozin @ 20.07.2012, 17:53:05 ) *
Zdajesz sobie sprawę z tego, że ta baza jest kompletnie nieprzygotowana do pracy z wieloma zapisami na raz - wewnętrzna struktura bazy może zostać uszkodzona w takim przypadku.

Zdaję sobie z tego sprawę. Niestety na takim szajsie pracuje nasz program magazynowy, a ja muszę pobierać dane z tego programu. Ostatnio pojawił się problem z zapisem danych. Podczas kiedy ja pracowałem na plikach poprzez PHP ktoś starał się zaksięgować stany magazynowe (prawdopodobnie tak było, bo pewności nie mam) i coś poszło nie tak, bo część danych nie została zapisana. Dlatego podejrzewam, że mogło mieć to coś wspólnego dostępem do pliku.
A gdyby tak kopiować plik i pracować na kopii? Czy podczas kopiowania plików dostęp do pliku źródłowego jest zablokowany? Kopiowanie trwa nieco ponad 1sek. ale i tak to duże ryzyko. Dlatego chciałbym wiedzieć, czy kopiowanie tego pliku byłoby w 100% bezpieczne.

Cytat(Crozin @ 20.07.2012, 17:53:05 ) *
Nie są blokowane, są po prostu otwarte (przez skrypt), a jak zapewne wiesz, plik który jest otwarty przez jakiś program nie może mieć zmienionej nazwy albo zostać usuniętym.

Ale próbowałem zrobić test na takim skrypcie. I przez pierwsze 20sek. nie mogłem zmienić nazwy pliku. Ale już po upływie 20sek. mogłem zmienić nazwę, mimo, że skrypt nadal się wykonywał.
  1. <?php
  2.  
  3. $dbase = dbase_open('...', 0);
  4. if ($dbase === false) {
  5. die('Błąd...');
  6. }
  7.  
  8. sleep(20);
  9. dbase_close($dbase);
  10. sleep(20);
  11. ?>
Crozin
Cytat
[...] Dlatego podejrzewam, że mogło mieć to coś wspólnego dostępem do pliku.
Przyczyn mogłoby być setki, a że baza danych nie posiada obsługi transakcji, a właściwie jednej z ich cech, tj. atomowości, mogła zostać naruszona wewnętrzna struktura bazy.
Cytat
A gdyby tak kopiować plik i pracować na kopii? Czy podczas kopiowania plików dostęp do pliku źródłowego jest zablokowany? Kopiowanie trwa nieco ponad 1sek. ale i tak to duże ryzyko. Dlatego chciałbym wiedzieć, czy kopiowanie tego pliku byłoby w 100% bezpieczne.
Przed rozpoczęciem kopiowania musiałbyś zablokować plik - najlepiej zarówno dla odczytu jak i zapisu - wykonać kopię, po czym usunąć blokadę.
Cytat
Ale próbowałem zrobić test na takim skrypcie. I przez pierwsze 20sek. nie mogłem zmienić nazwy pliku. Ale już po upływie 20sek. mogłem zmienić nazwę, mimo, że skrypt nadal się wykonywał.
Plik został otwarty w momencie wywołania dbase_open (linia #3), a zamknięty przy wywołaniu dbase_close (linia #9). Tak więc w momencie wykonywania się drugiego sleepa (linia #10) skrypt nie posiadał już uchwytu (ang. handle) do pliku dlatego też system operacyjny, a dokładniej system plików, pozwolił na zmianę nazwy.
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.