2012-01-19 15 views
5

Jestem nowy w PHP. Rozumiem, że mogę użyć flock(), aby zablokować plik i uniknąć warunków wyścigu, gdy dwóch użytkowników dojdzie do tego samego pliku php, dodając zawartość do pliku z blokadą.Jak uniknąć zakleszczeń plików podczas awarii procesu PHP/serwera?

Co się stanie, jeśli proces php ulegnie awarii? Co stanie się z następnym użytkownikiem czekającym na zablokowanie pliku? Co się stanie, jeśli serwer się zawiesza (ktoś wyciąga wtyczkę)? Czy zamek jest automatycznie zwolniony? Czy plik pozostanie zablokowany po ponownym uruchomieniu serwera?

Czy PHP sprawdza, czy takie sytuacje krytyczne (tzn. Blokada nie została jawnie zwolniona) są poprawnie obsługiwane? Jeśli nie, jak radzić sobie z takimi sytuacjami? Jak odzyskać z nich?

Odpowiedz

5

Blokady są obsługiwane przez system operacyjny. Dlatego:

  • Jeżeli katastrof technologicznych, wszystkie zamki to utrzymywane są uwalniane (wraz z jakiegokolwiek innego rodzaju zasobu to odbyło się)
  • jeśli awarii systemu, zamki są bez znaczenia, ponieważ nie „przenieść” do Kolejny restart:

PHP nie musi robić nic specjalnego poza użyciem mechanizmu dostarczonego przez system operacyjny do blokowania plików, więc generalnie jesteś całkowicie bezpieczny.

Jednak, jeśli konfiguracja serwera WWW jest tak, że każde żądanie nie jest obsługiwane przez nowy proces wtedy, gdy jeden wniosek został nieprawidłowo zakończony (powiedzmy wątek jest przerwana) blokada będzie się utrzymywać i zablokować wszystkie kolejne żądania blokadę, szybko powodując zakleszczenie serwera WWW. Jest to jeden z wielu powodów, dla których naprawdę, naprawdę nie powinno się używać konfiguracji, które nie zapewniają izolacji na poziomie procesu wśród żądań (disclaimer: Nie jestem ekspertem od serwera WWW - mógłbym się mylić w części "nie powinienem", mimo że wątpię w to).

Powiązane problemy