Wpis z mikrobloga

Mam taki problem. Muszę zrobić, aby jakiś skrypt PHP uruchamiał się o określonej porze. Tzn. powiedzmy mam stronę z ogłoszeniami, gdzie ogłoszenie ma wisieć przez 30 dni, a następnie musi zniknąć ze strony. Oczywiście można zrobić tak, aby np. codziennie o 24:00 wykonywał się skrypt i ogłoszenia znikałyby, ale ten wariant mi nie pasuje. Muszę mieć dokładność do do minuty/sekundy.

Wiem, że istnieje coś takiego jak -at (https://packages.debian.org/wheezy/at) co pozwala na wykonanie jakiegoś pliku o określonej godzinie. Tak więc jak połączyć te dwie rzeczy, czy np wykorzystać tylko jedną z nich do wykonania skryptu?

Na razie przedstawiam sobie, że mógłbym stworzyć plik, gdzie zapisywałbym dane, że taki i taki użytkownik dodał ogłoszenie o takiej godzinie i za 30 dni ogłoszenie musi być usunięte, a następnie cronem co minutę sprawdzać plik czy o tej porze musi wykonać się ten skrypt. Ewentualnie w PHP napisać kod, który będzie dodawał jakieś zadanie na jakiś termin przy pomocy pakietu -at. Niestety nie wiem czy moje myślenie jest prawidłowe i może ktoś wskaże mi drogę, która pomogłaby mi rozwiązać ten problem?

#php #linux #cron #webdev
  • 16
  • Odpowiedz
@mariecziek: crontab albo eventy w mysql.

A jesli ma byc co do minuty to przy publikacji ustawiaj expiry date i przy selekcie sprawdzaj expiry date vs sysdate czy tam now.

od czasu do czas z crona albo z eventu archiwrchiwizuj i tyle.
  • Odpowiedz
@piokom123: Nie do końca. Chciałbym powiedzmy wysłać maila po tym, jak ogłoszenie przestaje być aktywne, więc twój sposób raczej tu nie pasuje, ale może gdzieś wykorzystam ten pomysł.

@msq: Dziękuję. Poczytam o tych eventach.
  • Odpowiedz
Chciałbym powiedzmy wysłać maila po tym, jak ogłoszenie przestaje być aktywne, więc twój sposób raczej tu nie pasuje,


@mariecziek: No to sprawdzanie co kilkanascie minut i tak wystarczy. Maile na darmowe serwery potrafia dochodzic z kilkunastominutowym opoznieniem, wiec pare minut roznicy to nei bedzie konec swiata.

Poza tym jesli bedziesz mial tego duzo to i tak bedziesz musial te maile czy archiwizacje kolejkowac....
  • Odpowiedz
@mariecziek: a takie rozwiązanie: do tabeli dodaj pole z datą i czasem wygaśnięcia ogłoszenia, potem w funkcji/metodzie drukującej ogłoszenia daj warunkek if z exiprem, a w nim wywołanie funkcji/metody maila
  • Odpowiedz
@piokom123: chyba kłania mi się czytanie ze zrozumieniem...


Czyli Tobie chodzi o to, by było 30 dni od pierwszej/ostatniej odsłony?

  • Odpowiedz
@pumpkin: No powiedzmy allegro ma aukcje. Po zakończeniu aukcji maila otrzymuje zarówno sprzedawca jak i osoba, która wzięła udział w aukcji. Owszem, do wysłania maila nie potrzeba jest duża dokładność, ale do zakończenia aukcji już tak.

Dlatego interesuje mnie jak mam właśnie zrobić aż tak dokładne wykonaniu skryptu.

Z cron już zrobiłem usuwanie wszystkich plików starszych niż 2 dni (przy okazji testując skrypt usunąłem sobie wszystkie pliki z pulpitu), więc mniej
  • Odpowiedz
@pumpkin: Dobra. Mam aukcje na stronie. Po zakończeniu aukcji trzeba:

1. Zakończyć aukcję.

2. Zablokować możliwość stawiania stawek.

3. Wysłać powiadomienie do sprzedawcy i ewentualnie kupującego z informacją czy produkt został kupiony czy nie.

Na razie jeszcze nie ustaliłem czy ma być wysłany email czy będzie to się odbywało w systemie powiadomień, jak na facebooku.
  • Odpowiedz
@mariecziek: ok, ale pominąłeś jedną zasadniczą kwestię tych 30 dni widoczności aukcji... czy te 30 dni ma być liczone od: startu aukcji, pierwszego postawienia stawki, pierwszej odsłony aukcji, ostatniego postawienia stawki, czy ostatniej odsłony aukcji?

Te trzy punkty, które napisałeś powyżej rozwiązałbym tak:

1) if(temagiczne30dniktoreniewiemodkadmamliczyc){

zmiana
statusuaukcji(idaukcji, 2);

powiadomienie(idaukcji);


}


I teraz tak:


zmiana
statusuaukcji ma dwa parametry: pierwszym jest
  • Odpowiedz
@pumpkin: Aukcja działałaby od momentu jej wystawienia +30 dni. Normalnie, to myślałem, że przy pomocy pakietu -at w debianie ustawić wywołanie skryptu PHP, przekazanie do niego id aukcji. To by zwyczajnie zrobiłoby liste Jobs, które wykonałyby się jeden raz w ustawionym czasie.

Cronjob itd, bardzo obciążałoby serwer, bo co minutę musiałoby sprawdzać czy ma wywołać skrypt czy nie, a -at zwyczajnie kolejkowałoby zadania czy coś. Tak samo można byłoby wysyłać maile.
  • Odpowiedz
No to problem masz z głowy:

W tabeli z aukcjami dajesz pole created i tam timestamp, a przy funkcji drukującej warunek sprawdzający created z aktualną datą i czasem, jeśli ogłoszenie starsze, wywołanie funkcji zmieniającej status i wysyłanie wiadomości.

To rozwiązanie ma minusy: jeśli to bardzo duży serwis, bezsensowne będzie mielenie wszystkich rekordów (wydajność spadnie jak izabela c. w przejście podziemne)

A jeśli to faktycznie ma być duży, PL+ serwis, załatwisz to ładnie
  • Odpowiedz