Как добиться режима одиночной обработки при запуске php-скриптов?
У меня есть задание cron - php-скрипт, который вызывается один раз за 5 минут. Мне нужно быть уверенным, что ранее вызванный php-скрипт завершил выполнение - не хочу смешивать обрабатываемые данные.
Есть три подхода, которые я использовал для применения:
Создание вспомогательного текстового файла, содержащего флаг состояния выполнения. Выполняемый скрипт анализирует содержимое файла и прерывается, если флаг установлен в значение true. Это самое простое решение, но каждый раз, когда я создаю такое сценарий, я чувствую, что еще раз изобрел велосипед. Существуют ли какие-либо хорошо известные модели или передовые методы, которые удовлетворяли бы большинству потребностей?
Добавление службы UNIX. Этот подход лучше всего подходит для заданий cron. Но разработка и тестирование службы UNIX занимает больше времени: требуется хорошее знание сценариев bash.
Отслеживание процессов с использованием базы данных. Хорошее решение, но иногда использование базы данных не поощряется и опять же - не хочется изобретать велосипед, надеюсь, что уже есть хорошее гибкое решение.
Может быть, у вас есть другие предложения по управлению однократной обработкой php-скриптов? Был бы рад услышать ваши мысли по этому поводу.
4 answers
Я бы рекомендовал использовать механизм блокировки файлов. Вы создаете текстовый файл и заставляете свой процесс блокировать его исключительно (см. функцию php flock: http://us3.php.net/flock ). Если он не блокируется, то вы выходите, потому что запущен другой экземпляр. Преимущество использования блокировки файлов заключается в том, что если ваши PHP-скрипты неожиданно умрут или будут убиты, они автоматически снимут блокировку. Этого не произойдет, если вы используете обычные текстовые файлы для статуса (если для сценария установлено значение обновите этот файл в конце выполнения, и он неожиданно завершится, у вас останутся неверные данные).
Http://php.net/flock в вашем случае должно быть достаточно LOCK_EX.
Вы можете проверить, запущен ли ваш скрипт в данный момент, используя команду ps, с помощью команды grep. "man ps" и "man grep" расскажут вам все об этих командах unix/linux, если вам нужна информация об этом.
Давайте предположим, что ваш скрипт называется 'my_script.php ". Эта команда unix:
ps aux | grep my_script.php
...сообщит вам, запущен ли ваш скрипт. Вы можете запустить эту команду с shell_exec() в начале вашего сценария и выйти(), если это уже бежит.
Главное преимущество этого метода заключается в том, что он не может быть ошибочным, когда сценарий мог аварийно завершиться, оставив ваш файл флага в состоянии, которое позволит вам думать, что он все еще работает.
Я бы придерживался версии № 1. Это просто и работает. До тех пор, пока вы не захотите проверить, завершен ли сценарий или нет, этого должно быть достаточно. Если нужно запомнить более сложные данные, я бы выбрал версию 3, чтобы иметь возможность "запоминать" соответствующие данные...
Нтх
К