Как добиться режима одиночной обработки при запуске php-скриптов?


У меня есть задание cron - php-скрипт, который вызывается один раз за 5 минут. Мне нужно быть уверенным, что ранее вызванный php-скрипт завершил выполнение - не хочу смешивать обрабатываемые данные.

Есть три подхода, которые я использовал для применения:

  1. Создание вспомогательного текстового файла, содержащего флаг состояния выполнения. Выполняемый скрипт анализирует содержимое файла и прерывается, если флаг установлен в значение true. Это самое простое решение, но каждый раз, когда я создаю такое сценарий, я чувствую, что еще раз изобрел велосипед. Существуют ли какие-либо хорошо известные модели или передовые методы, которые удовлетворяли бы большинству потребностей?

  2. Добавление службы UNIX. Этот подход лучше всего подходит для заданий cron. Но разработка и тестирование службы UNIX занимает больше времени: требуется хорошее знание сценариев bash.

  3. Отслеживание процессов с использованием базы данных. Хорошее решение, но иногда использование базы данных не поощряется и опять же - не хочется изобретать велосипед, надеюсь, что уже есть хорошее гибкое решение.

Может быть, у вас есть другие предложения по управлению однократной обработкой php-скриптов? Был бы рад услышать ваши мысли по этому поводу.

Author: dplante, 2009-09-30

4 answers

Я бы рекомендовал использовать механизм блокировки файлов. Вы создаете текстовый файл и заставляете свой процесс блокировать его исключительно (см. функцию php flock: http://us3.php.net/flock ). Если он не блокируется, то вы выходите, потому что запущен другой экземпляр. Преимущество использования блокировки файлов заключается в том, что если ваши PHP-скрипты неожиданно умрут или будут убиты, они автоматически снимут блокировку. Этого не произойдет, если вы используете обычные текстовые файлы для статуса (если для сценария установлено значение обновите этот файл в конце выполнения, и он неожиданно завершится, у вас останутся неверные данные).

 2
Author: Palantir, 2009-09-30 09:00:23

Http://php.net/flock в вашем случае должно быть достаточно LOCK_EX.

 1
Author: Kane, 2009-09-30 09:01:19

Вы можете проверить, запущен ли ваш скрипт в данный момент, используя команду ps, с помощью команды grep. "man ps" и "man grep" расскажут вам все об этих командах unix/linux, если вам нужна информация об этом.

Давайте предположим, что ваш скрипт называется 'my_script.php ". Эта команда unix:

ps aux | grep my_script.php

...сообщит вам, запущен ли ваш скрипт. Вы можете запустить эту команду с shell_exec() в начале вашего сценария и выйти(), если это уже бежит.

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

 1
Author: Nicolas, 2009-09-30 09:04:52

Я бы придерживался версии № 1. Это просто и работает. До тех пор, пока вы не захотите проверить, завершен ли сценарий или нет, этого должно быть достаточно. Если нужно запомнить более сложные данные, я бы выбрал версию 3, чтобы иметь возможность "запоминать" соответствующие данные...

Нтх

К

 0
Author: KB22, 2009-09-30 08:56:11