Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wywołanie skryptu o określonej godzinie
Forum PHP.pl > Forum > Przedszkole
bladykiel
Witam. Otóż mam takie małe zapytanie.
Przykładowo:
Chcę aby codzinnie o godzinie 12:00 został wykonany skrypt zmieniający wartość w bazie danych jednego pola dla każdego z rekordów.
Czytałem co nieco o cronie, jednak czy jest jakiś inny sposób na wykonanie takiego skryptu?
in5ane
Jedyna inna opcja, to musisz codziennie o godzinie 12:00 sam uruchomić ten skrypt. A na poważnie, to nie bój się CRON'a, to żadna filozofia. Jeden wpis do crontab'a lub wyklikanie w panelu. A skrypt, to zwykły skrypt, bez żadnych dodatkowych rzeczy.
Michael2318
Zakładając, że co 24h chcesz jakiś tam skrypt uruchamiać o godzinie 12 to możesz dać jeszcze taki warunek w tle strony, który będzie sprawdzał czy obecna godzina jest równa bądź też większa 12-ej i dodatkowo będzie trzeba sprawdzać czy w danym dniu już był wykonywany ten skrypt. Jeśli nie to wykonujesz skrypt + aktualizujesz jakieś dodatkowe pole w bazie, informujące o tym, że w dniu 26.06.2014 skrypt był już odpalony i następny raz, kiedy warunek może się spełnić to kolejny dzień kalendarzowy.

Ale jeśli potrzebujesz uruchomienia skryptu dokłądnie o 12:00, bez poślizgu to jedynie cron bo jaką masz pewność, że ktoś akurat wejdzie na Twoją stronę o równej 12:00?
mmmmmmm
CREATE EVENT
bladykiel
Cytat(in5ane @ 26.06.2014, 11:26:41 ) *
Jedyna inna opcja, to musisz codziennie o godzinie 12:00 sam uruchomić ten skrypt. A na poważnie, to nie bój się CRON'a, to żadna filozofia. Jeden wpis do crontab'a lub wyklikanie w panelu. A skrypt, to zwykły skrypt, bez żadnych dodatkowych rzeczy.


Owszem. Jednak jestem dopiero w fazie "projektowania" strony a co do CRONa nie mam pewności czy będzie dostępny smile.gif
Ogólnie upraszczając, chodzi o "wyzerowanie" wartości dla każdego użytkownika o określonej godzinie.


btw. nie mam pewności czy ktoś będzie o tej godzinie na stronie smile.gif Skrypt ma zadziałać nawet gdy nikogo nie będzie na stronie
Michael2318
Ale spójrz... Jeśli na stronie nie ma żadnego użytkownika to niech ta wartość wynosi i 4125. Jeśli na stronie pojawi się jakiś user to matematycznie możesz sobie obliczyć ile ta wartość powinna wynosić, w zależności od danej godziny i hurtowo zaktualizować te wartości u wszystkich userów.

Dla usera ta zmiana będzie kompletnie niewidoczna.
Mam nadzieję, że łapiesz o co chodzi.
bladykiel
Chodzi o to, że użytkownik ma np. jakieś tam punkty, za które może coś robić, przez co ilośc tych punktów się kurczy. Natomiast codzinnie o np. godzinie 12 ma przywrócić wartość do stanu domyślnego. Oczywiście każdy użytkownik ma osobne "punkty".
Michael2318
No więc właśnie... Załóżmy, że mam obecnie 122 punkty i jest godzina 11:00. O godzinie 12:00 moje punkty powinny wynosić 100 bo punkty się resetują. Ale Ty nic nie robisz w CRONie itp. Ja loguję się o 13:10 i moje punkty powinny wynosić już ~105 załóżmy, ale nadal wynoszą 122 bo przy ostatnim logowaniu był taki licznik moich punktów.

Przy logowaniu tworzysz sobie prosty skrypt - jeśli obecnie jest godzina 12:00 lub większa i jeśli jeszcze dziś (w dniu dzisiejszym - 26.06.2014) nie było sprawdzane czy moje punkty zostały zresetowane to je resetujesz! I dopiero po tej operacji logujesz tego usera i user po zalogowaniu nie widzi żadnej różnicy, pomiędzy operacją CRON, a tym co ja CI tutaj piszę.
ziolo
Nie musisz crona używać.

Liczbę punktów obliczaj jako:

"Liczba punktów" = "Domyślna liczba punktów" - "liczba punktow wykorzystanych w aktywnosciach od ostatniej godziny 12:00"

Oczywiście musisz rejestrować aktywności z ich godziną.
bladykiel
Cytat(Michael2318 @ 26.06.2014, 11:47:23 ) *
No więc właśnie... Załóżmy, że mam obecnie 122 punkty i jest godzina 11:00. O godzinie 12:00 moje punkty powinny wynosić 100 bo punkty się resetują. Ale Ty nic nie robisz w CRONie itp. Ja loguję się o 13:10 i moje punkty powinny wynosić już ~105 załóżmy, ale nadal wynoszą 122 bo przy ostatnim logowaniu był taki licznik moich punktów.

Przy logowaniu tworzysz sobie prosty skrypt - jeśli obecnie jest godzina 12:00 lub większa i jeśli jeszcze dziś (w dniu dzisiejszym - 26.06.2014) nie było sprawdzane czy moje punkty zostały zresetowane to je resetujesz! I dopiero po tej operacji logujesz tego usera i user po zalogowaniu nie widzi żadnej różnicy, pomiędzy operacją CRON, a tym co ja CI tutaj piszę.


Właśnie o czymś takim myślałem, smile.gif
tylko co jesli uzytkownik jest zalogowany o tej godzinie ? Wstawianie skryptu sprawdzającego na każdą podstrone nie wchodzi w grę smile.gif
Michael2318
Ale ja nie rozumiem co CI szkodzi wstawić w tle taki banalny warunek:

  1. if ( time() >= mktime (12,0,0,6,26,2014) && $userdata['user_last_reset_points'] == date("d:m:Y") )
  2. {
  3. /// odpalamy ten skrypt
  4. }


Przecież jeśli warunek zwróci false to w ogóle nie tracisz na szybkości wykonania skryptu, na wydajności. W czym problem?

Ostatni czas aktualizacji trzymasz sobie w tabeli z użytkownikami bo każdy user może mieć inny dzień ostatniej aktualizacji skryptu, więc jak wyciągasz przy logowaniu nazwę usera, jego ID itp. do jakiejś tam tablicy (u mnie $userdata) - wyciągniesz jeszcze datę ostatniej aktualizacji skryptu i tyle.
bladykiel
Cytat(Michael2318 @ 26.06.2014, 12:01:45 ) *
Ale ja nie rozumiem co CI szkodzi wstawić w tle taki banalny warunek:

  1. if ( time() <= mktime (12,0,0,6,26,2014) && $userdata['user_last_reset_points'] == date("d:m:Y") )
  2. {
  3. /// odpalamy ten skrypt
  4. }


Przecież jeśli warunek zwróci false to w ogóle nie tracisz na szybkości wykonania skryptu, na wydajności. W czym problem?

Ostatni czas aktualizacji trzymasz sobie w tabeli z użytkownikami bo każdy user może mieć inny dzień ostatniej aktualizacji skryptu, więc jak wyciągasz przy logowaniu nazwę usera, jego ID itp. do jakiejś tam tablicy (u mnie $userdata) - wyciągniesz jeszcze datę ostatniej aktualizacji skryptu i tyle.


No niby tak. Tylko pytanie, czy nie jest to przerost formy nad trescią ? Dla przykładu każdy użytkownik klika codziennie setki razy na różne podstrony, za każdym razem następuje sprawdzenie warunku. A użytkowników jest np. 1000 albo i więcej. Wydaje mi się, iż nie jest to optymalne rozwiązanie.
Tymbardziej, że zapytanie do bazy sql wykonane o godzinie 12 wydaje mi się bardziej zoptymalizowanym wyborem.
Michael2318
Przecież to są zwyczajne warunki matematyczne, nie da się chyba stworzyć bardziej optymalnego warunku w PHP niż takie bzdety matematyczne w stylu: czy 120 jest większe od 140... Zresztą zrób sobie test u siebie jak to wygląda z tym kodem, który CI podałem i jak to wygląda po jego usunięciu.
bladykiel
OK, w takim razie dzięki za pomoc smile.gif
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.