Как обеспечить, чтобы дескриптор файла был закрыт, если время ожидания php-скрипта истекло? - PullRequest
3 голосов
/ 27 ноября 2009

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

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

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

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

Спасибо

1 Ответ

3 голосов
/ 27 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...