bladykiel
26.06.2014, 10:21:33
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
26.06.2014, 10: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.
Michael2318
26.06.2014, 10:27:58
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
26.06.2014, 10:29:34
CREATE EVENT
bladykiel
26.06.2014, 10:30:34
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

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

Skrypt ma zadziałać nawet gdy nikogo nie będzie na stronie
Michael2318
26.06.2014, 10:36:17
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
26.06.2014, 10:41:02
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
26.06.2014, 10: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ę.
ziolo
26.06.2014, 10:48:04
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
26.06.2014, 10:52:24
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,
tylko co jesli uzytkownik jest zalogowany o tej godzinie ? Wstawianie skryptu sprawdzającego na każdą podstrone nie wchodzi w grę
Michael2318
26.06.2014, 11:01:45
Ale ja nie rozumiem co CI szkodzi wstawić w tle taki banalny warunek:
if ( time() >= mktime (12
,0
,0
,6
,26
,2014
) && $userdata['user_last_reset_points'] == date("d:m:Y") ) {
/// odpalamy ten skrypt
}
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
26.06.2014, 11:13:20
Cytat(Michael2318 @ 26.06.2014, 12:01:45 )

Ale ja nie rozumiem co CI szkodzi wstawić w tle taki banalny warunek:
if ( time() <= mktime (12
,0
,0
,6
,26
,2014
) && $userdata['user_last_reset_points'] == date("d:m:Y") ) {
/// odpalamy ten skrypt
}
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
26.06.2014, 11:20:46
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
26.06.2014, 11:21:49
OK, w takim razie dzięki za pomoc
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.