Witam. Zrobiłem klasę która umozliwia wygodny odczyt i zapis plików w skrypcie, użyłem jej bardzo duzo wiec nie ma mowy o zamianie na inną.
Jest problem z synchronizacją plików które odczytuje: mianowicie jeśli nakładam LOCK_SH dla odczytu i LOCK_EX do zapisu, to wszystko jest dobrze do momentu gdy skrypt się zawiesi lub cokolwiek innego sie z nim stanie (np zostanie wyłączony przed zakończeniem pracy) i skrypt nie zdąży locka zdjąć, i żaden plik już nie uzyska dostępu do pliku, a każdy skrypt próbujący odczytac ten plik po prostu sie zawiesi i przytka serwer powodujac 100% zuzycie zasobów.
Rozwiązanie z timeoutem tez do mnie nie przemawia bo co z tego ze skrypt sie nie zawiesi skoro nie uzyska dostepu do pliku i trzeba interweniowac recznie, a z tego co zauwazylem flock($file, LOCK_UN) wywołany z innego skryptu na plik ktory byl wczesniej zablokowany, nie działa.
Rozwiązanie z tworzeniem plików .lock nie byłoby takie głupie, ale problem jest z synchronizacją..
Jeśli mam wyrażenie
if (!(filelock exist))
{
create filelock;
}
które najogolniej mowiac sprawdza czy blokujacy plik istnieje a jesli nie istnieje to tworzy plik lock dzieki czemu rezerwuje sobie dostep tez sie nie nadaje, bo jesli inny proces sie wbije miedzy instrukcje warunkowa a to co jest w jej ciele to wszystko sie rozjedzie.
Jest jakis bezpieczny (ktory anuluje sie sam po pewnym czasie) sposob blokowania plików a moze jest sposob na stworzenie sekcji krytycznej w PHP? (ciągu kodu który na pewno zostanie wykonany w calosci za jednym razem i nie bedzie wymieszany z innym wątkiem)
No i cudownie. Nikt nic nie wie, 3 dni wczesniej madry kolega z tego forum polecil mi przeniesienie sie z bazy danych na pliki jesli dla kazdego drzewa tworze nową tabele a teraz sie okazuje ze plików nie da sie zsynchronizować w ludzki sposob przez php i znowu musze wrocic do bazy danych i przepisywac ten durny kod jeszcze raz. Co za durny język. Kto wprowadził ten patch 5.3.2 (Usuneli sciaganie blokady pliku podczas zamkniecia skryptu)