Отмена выполнения скрипта, если скрипт запускается заново

yeaahhh

Старатель
Регистрация
8 Май 2008
Сообщения
278
Реакции
11
Доброго времени суток, друзья.
Такая ситуация:
Запускается скрипт по крону каждый час..
Иногда он не успевает отработать за 1 час и запускается этот же скрипт повторно.. Тем самым идет двойное выполнение скрипта..
(т.е. в скрипте есть добавление записей в БД, и после того, как становится 2 процесса одного и того же скрипта, записей в БД добавляется сразу 2 одинаковые..)
Как это можно исправить? Может написать какой-то запрет?
Буду благодарен за помощь)
 
Можно создать в бд таблицу (или в файле, как удобнее), в которую скрипт при старте записывает информацию о старте (время старта, например). В скрипт добавить проверку этого поля в бд перед стартом и очищение его при завершении. Только если скрипт завершил работу аварийно, то он уже не будет запускаться, т.к. из бд им не удалится запись. Чтоб обойти этот момент, в проверку при старте нужно добавить условие - если запись старше 2-3 часов. Т.е. алгоритм такой:
Проверяем наличие записи о старте в бд, если записи нет - записываем текущее время и стартуем, если запись есть - сверяем время прошлого старта и если оно меньше 2-3 часов - завершаем скрипт, если больше - обновляем запись и стартуем, выполняем основную задачу, стираем запись о старте из бд.
 
Ребят... это старо как мир...

Вот "дедовский" способ:
PHP:
  /* Создаём файлик старта скрипта */
  $filename = 'script.start.lock';

  if( !is_file($filename) ) {
      file_put_contents($filename, 'Script started');
  } else {
   
      /* Если файл есть, значит скрипт ещё в работе */
      exit();
  }

  /*
  Здесь наш рабочий код
  */

  /* Удаляем файл перед завершением работы скрипта */
  @unlink($filename);
 
Ребят... это старо как мир...

Вот "дедовский" способ:
PHP:
  /* Создаём файлик старта скрипта */
  $filename = 'script.start.lock';

  if( !is_file($filename) ) {
      file_put_contents($filename, 'Script started');
  } else {
 
      /* Если файл есть, значит скрипт ещё в работе */
      exit();
  }

  /*
  Здесь наш рабочий код
  */

  /* Удаляем файл перед завершением работы скрипта */
  @unlink($filename);
Если скрипт завершится с ошибкой (причин может быть множество), то он больше работать не будет, пока руками не удалишь файл. Поэтому желательно добавить проверку на последнее изменение файла (filemtime).
 
Если скрипт завершится с ошибкой (причин может быть множество), то он больше работать не будет, пока руками не удалишь файл. Поэтому желательно добавить проверку на последнее изменение файла (filemtime).

А я и не говорил, что данный пример это окончательный вариант... я привел это как пример... а уж как должен выглядеть квадрат, можно фантазировать бесконечно :)
А вот то, что скрипт завершается с ошибкой... это не есть хорошо и программист должен позаботится о всевозможных вариантах отработки скрипта. Не зря же придумали TRY - CATCH.
 
Назад
Сверху