Mam obawy, że moje skrypty operujące na plikach mogą się zakleszczać powodując awarie na serwerze. Po zakleszczeniu konieczny jest restart serwera! Dobrze byłoby, gdyby ewentualne zakleszczenia usuwały się same po upływie określonego czasu np. 30 sekund.
Funkcja set_time_limit () nie spełnia w tym przypadku swojego zadania, bo nie potrafi zakończyć działania skryptu, który nałożył na plik blokadę.
Prosty przykład. Są dwa skrypty, które nakładają blokady do zapisu na dwa pliki.
Skrypt1
CODE
set_time_limit(35);
echo '<br>START 1';
$plik = fopen("test_1", "w");
flock($plik, 2);
sleep(30); //opoznienie dzialania -czekaj 30 sek na otwarcie skryptu 2
$plik2 = fopen("test_2", "w");
flock($plik2, 2);
echo '<br>KONIEC 1';
Skrypt2
CODE
set_time_limit(2);
echo '<br>START 2';
$plik2 = fopen("test_2", "w");
flock($plik2, 2);
$plik = fopen("test_1", "w");
flock($plik, 2);
echo '<br>KONIEC 2';
Skrypt1 należy uruchomić pierwszy, a następnie w ciągu 30 sekund w (drugim oknie przeglądarki) Skrypt2. Oba skrypty będą działać w nieskończoność i zablokują dostęp do plików na zawsze, pomimo tego, że zostaną zamknięte okna przeglądarki. Nawet zarejestrowanie funkcji porządkującej za pomocą register_shutdown_function, która odblokuje pliki nic nie pomoże, ponieważ skrypty nie są przerwane przez upłynięcie dozwolonego czasu ustawionego za pomocą set_time_limit.
Zakleszczenie wynikło z tego, że skrypt2 czeka aż skrypt1 zwolni blokadę na plik test_1, a skrypt1 czeka na zwolnienie blokady na plik test_2
Wiem jak unikać zakleszczeń, ale przy większym projekcie, czasem może się coś przeoczyć, dlatego interesuje mnie, czy jest możliwość bezwzględnego, absolutnego, zakończenia skryptu i zwolnienie zasobów po upływie określonego czasu, czy istnieje coś co można ustawić w konfiguracji serwera, albo jakaś funkcja w php?
Pozdrawiam i czekam na odpowiedzi