Robert W.

Robert W. IT, Amazon

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Proste pytanie. Każdy z użytkowników ma swój kalendarz w którym zapisuje zadania do wykonania. Gdy użytkownik zapisze zadanie w swoim kalendarzu, zostaje powiadomienie o wpisie sms nie logując sie na stronie. Prawdopodobnie użyłbym crona do wykonywania skryptu php, który by sprawdzał tabelę w której upłynałby
czas. I teraz pytanie czy ustawić wykonywanie skryptu co sekundę by była zgodność z czasem zadania, czy np. dać odstęp co 10 minut przed planowanym zdaniem i sprawdzać, biorąc pod uwagę, że kalendarzy może być np. 1000 i np po 10 zadań w kazdym? Czy cron to wytrzyma? czy trzeba obliczyć wymagania sprzętowe takie jak rozmiar wierszy w tabeli zadań w bazie danych i czas wykonywania skryptu?
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: PHP i kod zadań w kalendarzu i powiadamianie

to zależy też od tego, jaki czas jest pomiędzy wpisami w kalendarzu - jeśli użytkownik może dodać zadania oddzielone od siebie o jedną sekundę i chcesz być profesjonalny to lepiej żeby klient właśnie w takim czasie także dostał wiadomość. Pierwsze co nasuwa się na myśl to puszczanie crona co sekundę, ale możesz to napisać inaczej:

Możesz napisać skrypt z nieskończoną pętlą, w której będziesz robił po prostu sleep na jedną sekundę. Z drugiej strony, zależy ile będzie tych wierszy w bazie, bo jeśli jedna iteracja będzie się wykonywała więcej niż jedną sekundę to wtedy pominiesz pewne rekordy:

1 iteracja (18:28:10) ---- muli i wysyła smsy
2 iteracja (18:28:26) ---- muli i wysyła smsy

pomiędzy 1 i 2 iteracją jest pewien odstęp czasu - pominięte wiersze.
Tutaj musiałbyś zrobić pewien przedział w zapytaniu.

konto usunięte

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Hmm... najprościej chyba byłoby tak:

W skrypcie, który wstawia zdarzenia do kalendarza dodajesz kawałek kodu, który wywołuje skrypt/funkcję wysyłającą sms-a z informacją o dodaniu zdarzenia. I nie ma tu potrzeby nadmiarowego puszczania cron-a, który np. nocą robiłby puste przebiegi z jednej strony, a z drugiej informujesz o dodaniu wpisu na bieżąco, bez żadnych opóźnień
Robert W.

Robert W. IT, Amazon

Temat: PHP i kod zadań w kalendarzu i powiadamianie

czyli majac tabele np zdarzenia wstawiam date ale w dodatkowej kolumnie np. tekst wstawiam kod php do wywolywania zdarzenia? czy raczej pisze kod ktory wstawia do tabeli zdarzenie i od razu wysyla sms powiadamia o zdarzeniu. Chodzi mi bardziej ze ustawiam np. zdarzenie np. na 20 czerwca i np. przed 10 min. za nim pojawi sie zdarzenie wyśle sms.

konto usunięte

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Robert Waligórski:
Prawdopodobnie użyłbym crona do wykonywania skryptu php, który by sprawdzał tabelę w której upłynałby
czas. I teraz pytanie czy ustawić wykonywanie skryptu co sekundę by była zgodność z czasem zadania,

O ile nie zaszły jakieś zmiany, to minimalny interwał crona to jedna minuta.

Temat: PHP i kod zadań w kalendarzu i powiadamianie

nie lepiej zamiast crona użyć at? Na razie nie mam pomysłu na konkretny, niezawodny sposób przekazywania danych do atd.. to tylko moja luźna myśl na uniknięcie niepotrzebnych obiegów crona ;)
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Robert Waligórski:
Chodzi mi bardziej ze ustawiam np. zdarzenie np. na 20 czerwca i np. przed 10 min. za nim pojawi sie zdarzenie wyśle sms.

Tutaj musisz użyć cron'a, który będzie chodził w tle i sprawdzał czy może już wysyłać jakieś zdarzenia. Tzn możesz zrobić tak jak Ci pisałem, skrypt z while - nie musisz wtedy puszczać crona co minutę, tylko co jakiś czas, żeby sprawdzał czy skrypt nie umarł.

Z cronem co minutę pojawia się prawdopodobieństwo, że taki skrypt zje bardzo dużo zasobów. Związane jest to z tym, że nie wiesz ile będzie się wykonywał skrypt jeśli zdarzeń będzie bardzo dużo. Być może cron odpali następny, zanim poprzedni się skończy i tak w kółko. Oczywiście mógłbyś użyć jakiś semafor - np tworzyć plik na dysku i uruchamiać skrypt jedynie wtedy gdy tego pliku niema, ale tutaj znów masz problem z pominiętymi rekordami o którym pisałem wcześniej.

konto usunięte

Temat: PHP i kod zadań w kalendarzu i powiadamianie

@Robert Waligórski

Nie złapałem o co ci chodzi :) w tym świetle mój post wyżej jest pozbawiony sensu ;)

konto usunięte

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Robert Waligórski:
Proste pytanie. Każdy z użytkowników ma swój kalendarz w którym zapisuje zadania do wykonania. Gdy użytkownik zapisze zadanie w swoim kalendarzu, zostaje powiadomienie o wpisie sms nie logując sie na stronie. Prawdopodobnie użyłbym crona do wykonywania skryptu php, który by sprawdzał tabelę w której upłynałby
czas. I teraz pytanie czy ustawić wykonywanie skryptu co sekundę by była zgodność z czasem zadania, czy np. dać odstęp co 10 minut przed planowanym zdaniem i sprawdzać, biorąc pod uwagę, że kalendarzy może być np. 1000 i np po 10 zadań w kazdym? Czy cron to wytrzyma? czy trzeba obliczyć wymagania sprzętowe takie jak rozmiar wierszy w tabeli zadań w bazie danych i czas wykonywania skryptu?

A nie można spróbować przerzucić tego problemu na providera wysyłki sms?
Może któryś z nich (trzeba by sprawdzić, może smsapi.pl?) posiada opcję podczas dodawania do kolejki sms'ów czas wysłania?
Wówczas, gdy użytkownik doda zadanie do kalendarza, od razu provider dostaje informację z czasem i dniem wysyłki wiadomości. Takie rozwiązanie eliminuje również ewentualnie problemy związane z zamuleniem serwera/opóźnieniem kilkusekundowym w wysyłce, itp.

konto usunięte

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Jakub Świegot:

Wówczas, gdy użytkownik doda zadanie do kalendarza, od razu provider dostaje informację z czasem i dniem wysyłki wiadomości. Takie rozwiązanie eliminuje również ewentualnie problemy związane z zamuleniem serwera/opóźnieniem kilkusekundowym w wysyłce, itp.

Gorzej jak zmodyfikuje albo usunie zadanie :)

konto usunięte

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Peter K.:
Gorzej jak zmodyfikuje albo usunie zadanie :)

no tak, chyba, ze provider smsowy zezwoli na kasowanie / edycje takich zadan :)
Robert W.

Robert W. IT, Amazon

Temat: PHP i kod zadań w kalendarzu i powiadamianie

no dobra a jak to robi google calendar z zadaniami, obsluguje przeciez kilkanascie takich kalendarzy? ciekawe jak to oni zrobili?,
Jakub Rajchowiak

Jakub Rajchowiak właściciel,
Rajchowiak.com

Temat: PHP i kod zadań w kalendarzu i powiadamianie

mysle ze rozwiazanie z providerem smsowym jest najlepsze. Ja korzystam z pswin i oni umoliwiaja taka opcje podania czasu wysylki. Jedynie problem jest taki ze czas moze byc tylko 7 dni do przodu. W takim przypadku wystarczy CRON co 5-10 minut aby sprawdzic czy nie ma zadan w ciagu najblizszych 10 min. Wtedy wyslac do providera poprawna informacje. w momencie wysylki smsma zablokowac mozliwosc kasowania zadania w kalendarzu, lub ustawic flage ze sms zoztsal wyslany i w momencie kasowania wywalic komunikat ze z powodu technicznych mimo kasowania zadania sms zostal wyslany.
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Jakub Rajchowiak:
lub ustawic flage ze sms zoztsal wyslany i w momencie kasowania wywalic komunikat ze z powodu technicznych mimo kasowania zadania sms zostal wyslany.

To chyba podchodzi pod bug'a. Użytkownik kasuje, żeby nie dostać smsa.
Michał S.

Michał S. Wspólnik, Bronchos

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Artur Świerc:
Robert Waligórski:
Chodzi mi bardziej ze ustawiam np. zdarzenie np. na 20 czerwca i np. przed 10 min. za nim pojawi sie zdarzenie wyśle sms.

Tutaj musisz użyć cron'a, który będzie chodził w tle i sprawdzał czy może już wysyłać jakieś zdarzenia. Tzn możesz zrobić tak jak Ci pisałem, skrypt z while - nie musisz wtedy puszczać crona co minutę, tylko co jakiś czas, żeby sprawdzał czy skrypt nie umarł.

Z cronem co minutę pojawia się prawdopodobieństwo, że taki skrypt zje bardzo dużo zasobów. Związane jest to z tym, że nie wiesz ile będzie się wykonywał skrypt jeśli zdarzeń będzie bardzo dużo. Być może cron odpali następny, zanim poprzedni się skończy i tak w kółko. Oczywiście mógłbyś użyć jakiś semafor - np tworzyć plik na dysku i uruchamiać skrypt jedynie wtedy gdy tego pliku niema, ale tutaj znów masz problem z pominiętymi rekordami o którym pisałem wcześniej.

CRON co 1 min + plik na dysku to sensowne rozwiązanie. Sam wykorzystuję w kilku projektach.

1. CRON odpala skrypt
2. Sprawdzamy, czy nie istnieje plik sms.lock
3. Nie istnieje -> tworzymy, istnieje -> koniec skryptu
4. Pobieramy dane o znaczniku wyslanoSMS=0 (lub o dowolnym innym warunku, który tylko raz może być spełniony)
5. Wysylamy SMS, aktualizujemy DB
6. Kasujemy plik sms.lock

Jedyny problem, jaki może się pojawić, to nieoczekiwane przerwanie skryptu i pozostawienie pliku sms.lock... Skrypt zatem należy napisać tak (+tak skonfigurować środowisko), aby nieoczekiwanie nie przerwał swego działania (timeout, etc.).
Można też napisac drugi skrypt i walnąć go do CRONA: sprawdzamy, czy kolejka jest większa od 0, a jeśli tak, czy co minutę ulega jakimkolwiek zmianom. Jeśli nie - usunąć plik sms.lock + alert mailem do admina.

Takie luźne przemyślenia, ale myślę, że warto spróbować zagłębić się w temat...Michał S. edytował(a) ten post dnia 01.06.10 o godzinie 00:50

konto usunięte

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Na linuxie można sobie proces phpowy odpalić "w tle". Albo z konsoli, albo forknąć w skrypcie pcntl_fork'iem. Zapętlić i nadać sleepa z odpowiednim interwałem np. w milisekundach.

W cronie dodać cominutowe sprawdzanie czy ten skrypt sobie w tym tle dalej wisi (może się zakończyć np. bo wystąpił błąd) i jeżeli go nie ma, to podnieść ponownie do tła.Peter K. edytował(a) ten post dnia 01.06.10 o godzinie 09:20
Rafał Korszuń

Rafał Korszuń co-owner @ Kleder

Temat: PHP i kod zadań w kalendarzu i powiadamianie

nawet zwykły plik sh który w pętli będzie uruchamiał program w 100% spełnia funkcję "łaczdoga" :)
Robert W.

Robert W. IT, Amazon

Temat: PHP i kod zadań w kalendarzu i powiadamianie

Wszytkim Wam dziękuję za cenne rady i wskazówki, już wiem czego się trzymać. Dzięki Wielkie.Robert Waligórski edytował(a) ten post dnia 01.06.10 o godzinie 10:59



Wyślij zaproszenie do