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

Тема в разделе "Как сделать...", создана пользователем yeaahhh, 15 дек 2014.

  1. yeaahhh

    yeaahhh

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

    zaxap83 Постоялец

    Регистр.:
    6 дек 2010
    Сообщения:
    87
    Симпатии:
    28
    Можно создать в бд таблицу (или в файле, как удобнее), в которую скрипт при старте записывает информацию о старте (время старта, например). В скрипт добавить проверку этого поля в бд перед стартом и очищение его при завершении. Только если скрипт завершил работу аварийно, то он уже не будет запускаться, т.к. из бд им не удалится запись. Чтоб обойти этот момент, в проверку при старте нужно добавить условие - если запись старше 2-3 часов. Т.е. алгоритм такой:
    Проверяем наличие записи о старте в бд, если записи нет - записываем текущее время и стартуем, если запись есть - сверяем время прошлого старта и если оно меньше 2-3 часов - завершаем скрипт, если больше - обновляем запись и стартуем, выполняем основную задачу, стираем запись о старте из бд.
     
    latteo и yeaahhh нравится это.
  3. cruide

    cruide Писатель

    Регистр.:
    25 июл 2012
    Сообщения:
    8
    Симпатии:
    22
    Ребят... это старо как мир...

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

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

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

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

    zaxap83 Постоялец

    Регистр.:
    6 дек 2010
    Сообщения:
    87
    Симпатии:
    28
    Если скрипт завершится с ошибкой (причин может быть множество), то он больше работать не будет, пока руками не удалишь файл. Поэтому желательно добавить проверку на последнее изменение файла (filemtime).
     
  5. cruide

    cruide Писатель

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