![]() |
![]() ![]() |
![]() |
![]()
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? |
|
|
![]()
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! |
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Jest w tym jakiś sens.
Jakieś inne propozycje? |
|
|
![]()
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. |
|
|
![]()
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?
|
|
|
![]()
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 mnieCytat 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. Serwer dedykowany, żaden tam home.pl. Mam pełen dostęp do crona
To tylko takie gdybanie gdyż wiele zależy od konfiguracji serwera i uprawnień jakie posiadasz. |
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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. |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
A jak usuwasz jakiś wpis?
|
|
|
![]()
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 |
|
|
![]()
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? |
|
|
![]()
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. |
|
|
![]()
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 |
|
|
![]()
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 Hm... to jest jakiś pomysł (IMG:style_emoticons/default/smile.gif) 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. @wookieb demon co sekunde? Po co? |
|
|
![]()
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
|
|
|
![]()
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) |
|
|
![]()
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]:
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 18:17 |