![]() |
![]() ![]() |
![]() |
![]()
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?
|
|
|
![]()
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: Odpal ten skrypt, a zaraz po tym odpal go jeszcze raz - równolegle. |
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 84 Pomógł: 4 Dołączył: 25.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
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. 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ł.
Ten post edytował miniol 20.07.2012, 17:20:40 |
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 16:16 |