выполнение по одному php-скрипту за раз из списка скриптов

0

У меня есть веб-приложение, из которого пользователь может выбрать список сценариев для выполнения, затем исполняемые действия добавляются в таблицу в mysql, и у каждого из них есть свое состояние, такое как "Ожидание", "Успех", "Не удалось" или "Выполняется" "пользователь также может отказаться от выполнения.

Проблема в том, что только один скрипт может быть выполнен одновременно, чтобы остальные могли дождаться завершения.

Моя environement - это LINUX (UBUNTU), а скрипты в PHP. Хотя я и делаю crontab, который выполняет php-скрипт, этот скрипт php будет захватывать информацию из таблицы sql и искать, если есть другое исполнение, если есть выполнение с состоянием "Выполняется", поэтому, если есть один, он просто выйдет, иначе он выполнит другое выполнение, имеющее состояние ожидания. Есть ли другое решение для этого?

  • 0
    Пожалуйста, отправьте код, показывающий, что вы делаете.
  • 0
    Я просто ищу лучшее решение, на данный момент я не делал никакого кода
Показать ещё 1 комментарий
Теги:

1 ответ

0
Лучший ответ

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

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

Более надежным способом является блокировка файлов:

    $lock_file = 'some_path/process.lock';

    $fd = fopen($lock_file, "w");
    if (!$fd)
        throw new Exception("Can't open file, check permissions on ".$lock_file, 1);

    if (!flock($fd, LOCK_EX + LOCK_NB))
        throw new AlreadyRunningException("Can't lock the file - another script is already running", 0);

Затем, после выполнения задания сценария, откройте файл:

        flock($fd, LOCK_UN);
        fclose($fd);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню