Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Harmonogram zadań w skrypcie php
Forum PHP.pl > Forum > PHP
bieniowa
Witam,

Otóż w tym poście bardziej zwracam się z prośbą o opinię/pomysł niż o konkretne rozwiązanie. Tworzę sobie pewien projekt, w którym będę chciał odpalać cyklicznie poszczególne skrypty. Powiedzmy, że skrypt A chcę żeby uruchamiał się co 30 minut, skypt B co 1h, skrypt C co 2h. Mogę oczywiście ustawić 3 crony i będzie po sprawie. No ale właśnie w tym wszystkim chodzi mi o to jak zrobić, żeby odpalając 1 crona z częstotliwością powiedzmy co minutę skrypt potrafił rozpoznać czy jest coś do zrobienia czy nie.

Jaka Waszym zdaniem jest najlepsza metoda na osiągnięcie tego celu?

Pozdrawiam Serdecznie,
Grzegorz

PotasK
To zależy jakiego typu mają to być skrypty, ale chyba najłatwiej wykonywać sprawdzanie "czy jest coś do zrobienia" na początku każdego skryptu poprzez instrukcje warunkowe, np:

  1. if (!$warunek)
  2. {
  3. }
  4.  
  5. // Skrypt właściwy


Naprawdę, ciężej powiedzieć cokolwiek bardziej konkretnego.

Zamiast cron jobs można też utworzyć daemona na serwerze (to "dość" rozbudowany temat, wić nie będę się w niego zagłębiał tutaj, Google pokaże Ci podstawy).
Daemony są uruchamiane bezpośrednio na serwerze (z konsoli na przykład) i działają w tle non-stop, dzięki użyciu pętli. Dobrze jest także dodać opóźnienia czasowe, aby zmniejszyć obciążenie serwera i zużycie pamięci.

Ale to wszystko zależy od tego, co chcesz osiągnąć. Wjednym przypadku lepszy będzie daemon, w innym cron jobs. Zwykle przy własnych rozwiązaniach trzeba to sprawdzić samemu, które z nich jest bardziej wydajne.
markonix
W bazie przechowywać nazwę albo inny identyfikator funkcji (albo nazwy pliku), ostatnie wykonane i częstotliwość.
Wszystko w czasie unix. Jednym zapytaniem bez problemu można wyciągnąć nazwy skryptów odejmując time od `last_run` i wynik tego większy od częstotliwości.
bieniowa
Niestety nie chcę żeby program od razu wykonywał wszystko co ma do zrobienia, tylko, żeby to było rozłożone w czasie. Jedyne co mi przyszło do głowy to coś takiego:

- Cron odpala się co minutę. Skrypt ma odpalać się raz na 30 minut.
- Przy każdym odpaleniu Crona jakaś wartość w bazie zwiększa się o 1.
- Jeśli ta wartość wynosi 30 to skrypt się odpala, a wartość zamienia się znowu na 0.

Takie rozwiązanie zagwarantuje mi to, że skrypt będzie mniej więcej odpalał się co pół godziny. No, ale na pewno są jakieś mądrzejsze rozwiązania. Może coś z datą, czasem?
Jestem ciekaw czy da się zrobić coś takiego:

- Po odpaleniu skryptu zapisuje się data i godzina jego wywołania. Do tej daty dodawane jest pół godziny i następnie przy kolejnych uruchomieniach program sprawdza czy ta data już była czy jeszcze nie. Jeśli była to skrypt się wykonuje.

markonix
Rozwiń mój pomysł o proste LIMIT 1 w zapytaniu co zapewni wykonywanie tylko jednego zadania w momencie "kolizji".
PotasK
A nie łatwiej ustawić cron joba, żeby wykonywał się co pół godziny?

Mam na myśli to, że można ustawić kilka cron jobs.
markonix
Cytat(PotasK @ 13.07.2012, 13:01:00 ) *
A nie łatwiej ustawić cron joba, żeby wykonywał się co pół godziny?

Mam na myśli to, że można ustawić kilka cron jobs.


Niepotrzebne, zaśmiecające, niewygodne, nieelastyczne i nie zabezpiecza przed kolizjami.
Jedyna zaleta to brak tego zapytania co minutę ale 1 lekkie zapytanie SQL raz na 60 sekund to żadne obciążenie.
bieniowa
Ok, mam już pomysł na rozwiązanie tego zagadnienia. Pomyślałem, że stworzę tabelę gdzie trafiać będą linki do skryptów, a także planowany czas jego wykonania. Po każdym uruchomieniu skryptu rekord z jego adresem będzie usuwany. Natomiast po zakończeniu skryptu do tabeli będzie trafiał kolejny link z nowym planowanym czasem. Muszę wziąć tylko na lekturę operacje na datach i godzinach. Póki co dziękuję za sugestie smile.gif
markonix
A czym to się różni od mojego sposobu oprócz tego, że chcesz (chyba) ustalać konkretne godziny co jest głupim pomysłem, bo nie przyjmujesz pod uwagę awarii, wykonujesz niepotrzebne zapytania i obliczenia na datach. No i co to znaczy "link" do skryptu?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.