Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Tryb odczytu pliku DBF
miniol
post 20.07.2012, 15:25:04
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 4
Dołączył: 25.03.2011

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


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?
Go to the top of the page
+Quote Post
Crozin
post 20.07.2012, 15:48:19
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
miniol
post 20.07.2012, 15:56:35
Post #3





Grupa: Zarejestrowani
Postów: 84
Pomógł: 4
Dołączył: 25.03.2011

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


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.

Ten post edytował miniol 20.07.2012, 16:05:17
Go to the top of the page
+Quote Post
Crozin
post 20.07.2012, 16:53:05
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
miniol
post 20.07.2012, 17:16:27
Post #5





Grupa: Zarejestrowani
Postów: 84
Pomógł: 4
Dołączył: 25.03.2011

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


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


Ten post edytował miniol 20.07.2012, 17:20:40
Go to the top of the page
+Quote Post
Crozin
post 20.07.2012, 17:54:28
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
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: 18.07.2025 - 16:16