У меня есть php-скрипты, которые я должен запускать как на Linux, так и на серверах Windows.
Я хочу использовать одни и те же сценарии без каких-либо изменений для этих двух сред.
Эти сценарии будут запланированы с помощью cron (в linux) и планировщиком windows (или другим, мне сейчас наплевать) для среды Windows.
Однако выполнение некоторых из этих сценариев может занять несколько минут. Я просто хочу предотвратить запуск того же сценария планировщиком (cron или windows) до того, как он завершит работу при последнем запуске.
Я не уверен, как это сделать ..
Я хочу быть уверен, что «блокировка» снята, если во время выполнения что-то пойдет не так, поэтому она будет запущена снова в следующий раз без участия человека.
Может быть, с пачкой на фиктивном файле все получится, но я не уверен, как это сделать.
У меня также есть база данных MySQL на этих серверах. Я подумал, может быть, используя блокировку на стороне базы данных.
1- Start a transaction
2- Insert script name in a table.
3- execution of the script.
4- If successful then delete the row and commit the transaction or simply rollback;
Если имя скрипта находится в таблице, я могу запретить его запуск.
Если выполнение скрипта завершится неудачно, Mysql автоматически откатит транзакцию, чтобы строка не появлялась при следующем вызове скрипта.
Но в транзакции, есть ли способ, чтобы другие соединения увидели незафиксированные данные? если да, то как?
Я также подумал, используя блокировку строки, если невозможно использовать функцию отката ..
1- Insert script name in a table if it doesn't already exists.
2- Start a transaction.
2- Select * from Table where script_name FOR UPDATE.
3- execution of the script.
4- If successful then release the lock (rollback or commit).
Но моя главная проблема здесь с Mysql. Выберите FOR UPDATE зависать, пока не будет снята предыдущая блокировка или не истечет тайм-аут 50 секунд (переменная innodb_lock_wait_timeout) Я хотел бы, чтобы Mysql сразу сказал мне, что моя строка заблокирована, не затрагивая всю базу данных. Это связано с тем, что переменная innodb_lock_wait_timeout является глобальной (а не сеансовой).
Существует ли другая переменная, имитирующая предложение NO_WAIT, которая доступна в Oracle?
Или я должен позволить скрипту висеть без проблем 50 секунд?
Каков наилучший подход к этому, так как я новичок в php и не хочу вызывать никаких проблем на сервере.
Может быть, у меня есть другой вариант, который я не видел ..