Jak zapobiec wielokrotnym wystąpieniom skryptu?

Mam skrypty php, które muszę uruchamiać zarówno na Linuksie, jak i na serwerach Windows. Chcę używać tych samych skryptów bez dokonywania żadnych modyfikacji dla tych 2 środowisk.

Te skrypty będą zaplanowane z cronem (na Linuksie) iz programem planującym Windows (lub innym, na które nie dbam teraz) dla mojego środowiska Windows.

Jednak niektóre z tych skryptów mogą potrwać kilka minut. Chcę tylko zapobiec uruchomieniu tego samego skryptu przez program planujący (cron lub system Windows) przed zakończeniem jego ostatniego uruchomienia.

Nie jestem pewien, jak to zrobić. Chcę mieć pewność, że „blokada” zostanie zwolniona, jeśli coś pójdzie nie tak podczas wykonywania, więc uruchamia się ponownie następnym razem bez interwencji człowieka.

Może ze stadem na sztucznym pliku załatwi sprawę, ale nie jestem pewien, jak to zrobić.

Mam także bazę danych MySQL na tych serwerach. Pomyślałem, że mogę użyć blokady po stronie bazy danych.

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;

Jeśli nazwa skryptu znajduje się w tabeli, wtedy mogę zapobiec jego uruchomieniu. Jeśli wykonanie skryptu nie powiedzie się, Mysql automatycznie cofnie transakcję, więc wiersz nie pojawi się przy następnym wywołaniu skryptu.

Ale czy w przypadku transakcji istnieje sposób, aby inne połączenia mogły zobaczyć niezatwierdzone dane? jeśli tak, jak?

Pomyślałem też, że użycie blokady w wierszu jest niemożliwe, jeśli nie można użyć funkcji cofania.

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).

Ale moim głównym problemem jest Mysql. Wybierz FOR UPDATE hang, aż poprzednia blokada zostanie zwolniona lub upłynie 50-sekundowy limit czasu (zmienna innodb_lock_wait_timeout). Chciałbym, aby Mysql powiedział mi od razu, że mój wiersz jest zablokowany bez wpływu na całą bazę danych. Dzieje się tak, ponieważ zmienna innodb_lock_wait_timeout jest zmienną globalną (a nie sesyjną). Czy istnieje inna zmienna naśladująca klauzulę NO_WAIT, która jest dostępna w Oracle?

A może powinienem pozwolić skryptowi zawiesić się 50 sekund bez żadnego problemu?

Jaki jest najlepszy sposób na to, ponieważ jestem nowicjuszem php i nie chcę powodować żadnych problemów na serwerze.

Może mam inną opcję, której nie widziałem ..

questionAnswers(5)

yourAnswerToTheQuestion