Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> dynamiczny cron
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Potrzebuję mieć dynamiczny cron, tzn. użytkownicy aplikacji mogą tworzyć różne zdarzenia i chcieć je wywoływać o określonej porze.
Rozważam dwa rozwiązania:
1) Aplikacja dodaje wpisy do crona
2) Dane czasowe zapisuję w bazie i w cronie co minutę latam po bazie i sprawdzam czy akurat teraz jest jakiś zaplanowany wpis

Problemy dla rozwiązania 1):
- z czasem zdarzeń może być tysiące. Czy nie zapełni mi się cron przy takiej liczbie wpisów?
- czy w ogóle można edytować plik crona. Jeszcze nad tym się nie zastanawiałem

Problemy dla rozwiązania 2):
- wpisów może być tysiące. Czy skrypt obsłuży mi w ciągu minuty tysiące rekordów
- czy cron odpala się dokładnie co minute? Nie ma lagów? np. ostatnie wywołanie crona będzie w 3:59 (minuty:sekundy), zaś aktualne w 5:01 - jak widać cron odpalił się po minucie i dwóch sekundach, i w tym czasie stracił odpalenie dla minuty czwartej.

To są narazie luźne moje przemyślenia. Macie z tym jakieś doświadczenia? Macie jakieś pomysły?
Go to the top of the page
+Quote Post
posiadacz
post
Post #2





Grupa: Zarejestrowani
Postów: 46
Pomógł: 2
Dołączył: 2.04.2009

Ostrzeżenie: (0%)
-----


ja bym zrobił na sposób 2.

Przy każdym odpaleniu zapisujesz datę ostatniego odpalenia albo datę nastepnego odpalenia.
W zapytaniu sprawdzasz czy data ostatniego odpalenia + okres odpalenia już minął albo czy data następnego odpalenia już minęła.

Powodzenia!
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jest w tym jakiś sens.
Jakieś inne propozycje?
Go to the top of the page
+Quote Post
d3ut3r
post
Post #4





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


Co do konfliktu z czasem wykonywania to mogą wyjść cyrki (IMG:style_emoticons/default/smile.gif) , CRON uruchomi 2 procesy jeżeli pierwszy się nie zakończył i drugi zacznie działać na danych których pierwszy jeszcze nie zmodyfikował może powstać jakiś problem logiczny.

Tak czy inaczej wszystko zależy od serwera np. na home.pl żeby zrobić zadanie CRON trzeba utworzyć plik o odpowiedniej nazwie (czas uruchamiania co 5 minut) jeżeli hosting udostępnia jakieś API do panelu zarządzania kontem to raczej nie będzie problemu z dodaniem zadań do CRONTAB ew. wykonanie polecenia wiersza poleceń w celu dodania zadania.

To tylko takie gdybanie gdyż wiele zależy od konfiguracji serwera i uprawnień jakie posiadasz.
Go to the top of the page
+Quote Post
wookieb
post
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Jak dużo "akcji" na raz przewidujesz?
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Co do konfliktu z czasem wykonywania to mogą wyjść cyrki , CRON uruchomi 2 procesy jeżeli pierwszy się nie zakończył i drugi zacznie działać na danych których pierwszy jeszcze nie zmodyfikował może powstać jakiś problem logiczny.
To akurat nie problem dla mnie

Cytat
Tak czy inaczej wszystko zależy od serwera np. na home.pl żeby zrobić zadanie CRON trzeba utworzyć plik o odpowiedniej nazwie (czas uruchamiania co 5 minut) jeżeli hosting udostępnia jakieś API do panelu zarządzania kontem to raczej nie będzie problemu z dodaniem zadań do CRONTAB ew. wykonanie polecenia wiersza poleceń w celu dodania zadania.

To tylko takie gdybanie gdyż wiele zależy od konfiguracji serwera i uprawnień jakie posiadasz.
Serwer dedykowany, żaden tam home.pl. Mam pełen dostęp do crona
Go to the top of the page
+Quote Post
d3ut3r
post
Post #7





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


w takim razie ja bawiłbym się z wykorzystaniem CRONTABA do każdego zadania.
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Jak dużo "akcji" na raz przewidujesz?
Docelowo to pewnie tysiące. Na początku "nędzne" dziesiątki (IMG:style_emoticons/default/wink.gif)
Każda "akcja" będzie wykonywana jako oddzielny proces w tle. Przynajmniej tak by było w wersji nr 2
Go to the top of the page
+Quote Post
m44
post
Post #9





Grupa: Zarejestrowani
Postów: 63
Pomógł: 10
Dołączył: 16.11.2008

Ostrzeżenie: (0%)
-----


Jak dedykowany to może demon w php odpalany przez crona. Jeśli zwiększy się liczba zdarzeń, można uruchomić dwa lub więcej demonów obsługujących zdarzenia w wyznaczonych godzinach.
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
w takim razie ja bawiłbym się z wykorzystaniem CRONTABA do każdego zadania.
Przyznam szczerze, że nie szukałem jeszcze odpowiedzi na pytanie, które teraz ci zadam:
A mogę bez problemu edytować ogólny plik crontaba jak normalny plik tekstowy? Z tego co szczątkowo czytałem, w zależności od systemu zapiski crontaba mogą leżeć w totalnie różnych miejscach
Go to the top of the page
+Quote Post
d3ut3r
post
Post #11





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


Hmm generalnie edycja CRON w jednym moim skrypcie wygląda tak:

1. Tworzę wpis z pojedynczym zadaniem wg zasad http://www.cyberciti.biz/faq/how-do-i-add-...x-or-unix-oses/
2. Następnie wykonuję polecenie crontab nazwa_pliku.txt powoduje to dopisanie zadania z pliku tekstowego do tablicy cron, w ten sposób nie musisz sam lokalizować pliku z tablicą ponieważ sam system wszystko dopisze w zależności od własnej konfiguracji.

Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A jak usuwasz jakiś wpis?
Go to the top of the page
+Quote Post
d3ut3r
post
Post #13





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


No właśnie, na początek przepraszam wprowadziłem w błąd za szybko chciałem odpisać (IMG:style_emoticons/default/smile.gif)

generalnie jest tak, że polecenie crontab nazwa_pliku.txt nadpisuje tablicę cron a nie dopisuje do niej. Więc generujesz cały plik ze wszystkimi zadaniami i wykonujesz polecenie. Przydatny jest przełącznik -u nazwa_usera wtedy edytujesz zadania tylko dla danego użytkownika.

A tutaj przykład jak dopisać tylko jedno zadanie do pliku.

http://stackoverflow.com/questions/610839/...-a-new-cron-job

Ten post edytował d3ut3r 1.03.2011, 12:18:24
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Użytkownicy nie mają kont w systemie, więc opcja z oddzielnym crontab odpada.
Generowanie całego pliku crontaba przy każdej zmianie jakiegoś harmonogramu to też średnio fajne rozwiązanie.
W pliku tym, znajdować się też będą wpisy, który dodałem ręcznie (jak rozsyłka maili itp).
Rozwiązaniem by było, aby moje ręczne wpisy trzymał na userze X, a automatyczne na userze Y - to by było jakieś wyjście.
Kolejny problem jaki mi się tu widzi to co będzie w sytuacji, że w tym samym czasie dwie osoby zmienią jakiś harmonogram? Przy crontabie liczącym tysiące wpisów nie będzie przypadkiem problemu gdy naraz będę próbował załadować dwa duże pliki z wpisami?
Go to the top of the page
+Quote Post
wookieb
post
Post #15





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Więc pozostaje wszelkiego rodzaju DEMON wyszukujący co sekundę nowych zadań. Rozwiązanie najwygodniejsze. Kwestia tylko W CZYM napisać taki DEMON. Nie sądzę aby PHP był do tego celu dobrym rozwiązaniem.

Zabrzmi strasznie lamersko ale ja bym to zrobił nawet w NODEJS. Jeżeli ktoś ma inną propozycję z chęcią wysłucham.
Go to the top of the page
+Quote Post
d3ut3r
post
Post #16





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


hmm można by pokusić się o napisanie klasy do obsługi crontab generalnie polecenie crontab -l zwróci listę aktualnych zadań można na jej podstawie utworzyć tablicę z zadaniami następnie na niej operować i za pomocą crontab nazwa_pliku zapisywać czyli po wczytaniu tablicy możemy dowolnie na niej operować dodawać / usuwać zadania.

Chyba jednak zadanie będzie trudniejsze niż się wydawało (IMG:style_emoticons/default/smile.gif) Rozwiązaniem wydaje mi się byłaby synchronizacja CRONTAB za pomocą CRON (IMG:style_emoticons/default/smile.gif) wyglądałoby to mniej więcej tak, że dajesz panel do edycji
zadań te zadania zapisują się w bazie a po każdym updacie dajesz informacje że zmiany zostaną naniesione w ciągu najbliższych 5 minut i zadanie CRON uruchamiane co 5 minut uaktualnia crontab który już działa zgodnie z harmonogramem poszczególnych zadań. Zaimportowanie nawet dużego pliku do crontab nie powinno zająć dużo czasu. Jeżeli dodasz do tego jakiś mechanizm który co te 5 minut będzie sprawdzał czy update cron jest konieczny to i tak moim zdaniem będzie to wydajniejsze niż 2 sposób.

Ten post edytował d3ut3r 1.03.2011, 12:38:21
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Rozwiązaniem wydaje mi się byłaby synchronizacja CRONTAB za pomocą CRON wyglądałoby to mniej więcej tak, że dajesz panel do edycji
zadań te zadania zapisują się w bazie a po każdym updacie dajesz informacje że zmiany zostaną naniesione w ciągu najbliższych 5 minut i zadanie CRON uruchamiane co 5 minut uaktualnia crontab który już działa zgodnie z harmonogramem poszczególnych zadań. Zaimportowanie nawet dużego pliku do crontab nie powinno zająć dużo czasu. Jeżeli dodasz do tego jakiś mechanizm który co te 5 minut będzie sprawdzał czy update cron jest konieczny to i tak moim zdaniem będzie to wydajniejsze niż 2 sposób.
Hm... to jest jakiś pomysł (IMG:style_emoticons/default/smile.gif)

@wookieb demon co sekunde? Po co?
Go to the top of the page
+Quote Post
wookieb
post
Post #18





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




TFU. Co minutę oczywiście
Go to the top of the page
+Quote Post
yevaud
post
Post #19





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


teoretycznie mozna byloby pisac swoje rozwiazania ktore moglyby robic cuda forkujac sie po systemie, izolujac odpalane procesy, nasluchujac, synchronizujac itp itd.
ale moim zdaniem najlepiej oprzec sie na juz dzialajacym rozwiazaniu -> tzn. cronie.

wpisy do crona trzymalbym w bazie danych, skrypt ktory cos dodaje/odejmuje modyfikuje tylko ta baze danych.
W cronie(pewnie tez nawet w bazie) dodalbym skrypt ktory co minute aktualizowalby plik crona na podstawie bazy. Aktualizacje zrobilbym w ten sposob, ze pisalbym do jakiegos tmp i pozniej podmienial plik(zeby lockowac jak najkrocej)

Najgorsza czesc roboty tutaj odwala sam cron, rozwiazanie dobrze sie skaluje, gdyby faktycznie okazalo sie po jakims czasie, ze sam cron sie nie wyrabia z procesami, to takie rozwiazanie latwo mozna uzupelnic o "swojego crona", ale prawdopodobnie cron wystarczy wiec YAGNI (IMG:style_emoticons/default/wink.gif)

Minus: na wyniki aktualizacji trzeba byloby czekac 2 minuty!, ale mysle ze to naprawde maly problem.

btw. cron z tego co wiem sprawdza swoj plik w okienkach 30 sekund, wiec fajnie jakby udalo sie wygnerowac plik w okienku 0-29 sekund (IMG:style_emoticons/default/smile.gif)

Go to the top of the page
+Quote Post
nospor
post
Post #20





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@wookieb Czym będzie się różnił demon od skryptu odpalanego co minutę, który będzie robił to samo co demon?

Cytat
wpisy do crona trzymalbym w bazie danych, skrypt ktory cos dodaje/odejmuje modyfikuje tylko ta baze danych.
W cronie(pewnie tez nawet w bazie) dodalbym skrypt ktory co minute aktualizowalby plik crona na podstawie bazy. Aktualizacje zrobilbym w ten sposob, ze pisalbym do jakiegos tmp i pozniej podmienial plik(zeby lockowac jak najkrocej)

Najgorsza czesc roboty tutaj odwala sam cron, rozwiazanie dobrze sie skaluje, gdyby faktycznie okazalo sie po jakims czasie, ze sam cron sie nie wyrabia z procesami, to takie rozwiazanie latwo mozna uzupelnic o "swojego crona", ale prawdopodobnie cron wystarczy wiec YAGNI

Minus: na wyniki aktualizacji trzeba byloby czekac 2 minuty!, ale mysle ze to naprawde maly problem.

@yevaud czyli napisałeś to samo co w ostatnim poście d3ut3r (IMG:style_emoticons/default/smile.gif)
To że trzeba by poczekać na wynik aktualizacji to faktycznie żaden problem
Powód edycji: [nospor]:
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 18:17