Mam wbudowany system buforowania w phpprzechowuje wyniki zapytania mysql w formacie xml. Blokuję pamięć podręczną podczas budowania, tworząc plik blokady z wyłącznym uchwytem do zapisu, a następnie usuwam go po zakończeniu tworzenia pliku pamięci podręcznej.
Jednak zdarzają się sytuacje, w których skrypt przekracza limit czasu lub zatrzymuje się w trakcie wykonywania, pozostawiając plik blokujący na miejscu, co powoduje, że podczas kolejnych uruchomień skryptu pamięć podręczna jest zawsze aktualizowana.
Próbowałem sprawdzić, czy plik jest liczbąminut i próbuję uzyskać wyłączny dostęp do zapisu do pliku, aby odświeżyć blokadę i rozpocząć wykonywanie, jednak wydaje się, że plik jest nadal otwarty z poprzednim uchwytem i nie mogę otworzyć nowego uchwytu, aby upewnić się, że bieżący proces jest jedynym jeden z dostępem i ponownie zablokuj plik.
Czy istnieje sposób, aby upewnić się, że jeśli skrypt zostanie zatrzymany w trakcie wykonywania, wszelkie otwarte uchwyty plików zostaną zamknięte, a zaangażowane pliki będą dostępne dla przyszłych procesów?
Dzięki
Odpowiedzi:
3 dla odpowiedzi № 1Kiedy interpreter PHP kończy pracę, wywołuje fclose()
na wszystko otwierać pliki, zwalniając w ten sposób wszelkie blokady. Może jeszcze nie znalazłeś odpowiedniego problemu.
Jeśli jednak musisz coś wyczyścić przed zakończeniem działania skryptu - użyj register_shutdown_function()
. Zarejestrowana funkcja zostanie wywołana nawet wtedy, gdy skrypt zakończy się błędem.