У меня есть веб-приложение, из которого пользователь может выбрать список сценариев для выполнения, затем исполняемые действия добавляются в таблицу в mysql, и у каждого из них есть свое состояние, такое как "Ожидание", "Успех", "Не удалось" или "Выполняется" "пользователь также может отказаться от выполнения.
Проблема в том, что только один скрипт может быть выполнен одновременно, чтобы остальные могли дождаться завершения.
Моя environement - это LINUX (UBUNTU), а скрипты в PHP. Хотя я и делаю crontab, который выполняет php-скрипт, этот скрипт php будет захватывать информацию из таблицы sql и искать, если есть другое исполнение, если есть выполнение с состоянием "Выполняется", поэтому, если есть один, он просто выйдет, иначе он выполнит другое выполнение, имеющее состояние ожидания. Есть ли другое решение для этого?
Лучше использовать атомную проверку. Способ, которым вы выполняете это с базой данных, не является атомарным, поскольку после того, как вы проверили, что другие сценарии не запущены, но прежде чем вы напишите, что запущен текущий скрипт, другой процесс может выполнить одну и ту же проверку, и поэтому вы получите два параллельных скрипты.
Кроме того, если сценарий по какой-либо причине прерывается ненормально, он не будет обновлять базу данных, поэтому другие сценарии не смогут начать вообще.
Более надежным способом является блокировка файлов:
$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);