2009-11-27 2 views
3

У меня есть система кэширования в php, которая хранит результаты запроса mysql в xml. Я блокирую кеш при создании, создавая файл блокировки с исключительным дескриптором записи, а затем удаляю его, как только файл кэша будет завершен.Как убедиться, что дескриптор файла закрыт, если скрипт php истекает?

Тем не менее, иногда сценарий прерывается или останавливается в середине исполнения, оставляя файл блокировки на месте, делая любые дальнейшие действия сценария, полагая, что кеш всегда обновляется.

Я пробовал проверять файл на несколько минут и пытаюсь получить эксклюзивный доступ для записи к файлу, чтобы обновить блокировку и начать выполнение, однако кажется, что файл по-прежнему открыт с предыдущим дескриптором и Я не могу открыть новый дескриптор, чтобы гарантировать, что текущий процесс является единственным с доступом и удалением файла.

Есть ли способ гарантировать, что если сценарий остановлен в середине выполнения, все открытые дескрипторы файлов закрываются, а файлы, доступные для доступа к будущим процессам, доступны?

Благодаря

ответ

3

Когда интерпретатор PHP выходит он вызывает fclose() на все открытые файлы, освобождая тем самым любые замки. Возможно, вы еще не нашли правильной проблемы.

Однако, когда вам нужно что-то убрать перед завершением сценария, используйте register_shutdown_function(). Зарегистрированная функция вызывается даже тогда, когда скрипт завершается с ошибкой.

+0

Спасибо за ответ Эмиль, я обнаружил, что я использовал неправильный режим на моем fopen при проверке застрявших файлов блокировки, и он всегда возвращал false независимо от того, что еще я сделал. Я сейчас работаю, чтобы изменить это и убедиться, что любой результат, который я получаю, является правильным результатом, а не ложным результатом. Иногда выяснение актуальной проблемы сложнее, чем исправление, если вы знаете, что не так. – coffeecoder

Смежные вопросы