Løbende points

Tags:    php

Jeg er ved at lave en slags community side, der er jeg støt på en ting jeg ikke lige har prøvet før.

Jeg skal ha lavet noget point system, hvilket jeg har fikset, men jeg skal også ha lavet et eller andet der gør at brugeren løbende får points på kontoen.. sådan ca 2-3 points om dagen.. også når personen ikke er logget ind.

Er der nogen der har et forslag til hvordan jeg løser dette?

jeg udvikler i php, med en mysql database.


dette er en af mine første posts herinde i lang tid, så ved ik lige om jeg har sat nok points af? :)



9 svar postet i denne tråd vises herunder
7 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
Det kan laves med et cron job, som lægger 2-3 points til alle brugeres point engang om dagen.

Du kan også lave det ved at se hvor lang tid det er siden, at brugeren sidst har været logget ind og derved beregne hvor mange point systemet "skylder" ham.



Du har kun brug for at opdatere de daglige points, når der er nogen der vil se hans antal af points/han skal bruge sine points.

Lav et script der tjekker, hvor lang tid der er gået siden hans sidste login, og så giv ham 2 points for hver 24. time.

Dette script sätter du to steder:
Når nogen skal se hans antal af points (fx i profilen)
Når personen skal bruge sine points.





Hej Nørden,

Ja, så med mindre der er rigtig mange brugere som vil se andre (flere andre) brugeres informationer hele tiden, vil det være en "update on request" strategi som er mest effektiv.

Så indtil da man har over 5.000 brugere vil et Cron Job ikke være en god strategi. Og benytter man Cron Jobs på en server man ikke selv ejer (webhotel eksempelvis) vil udbyderen lægge mærke til det regelmæssige "peak load" og formentlig blive rimelig gal.

Med venlig hilsen
Ieet




Hmm... der er intet der kan argumentere for at cronjobs er et dårligere valg end et SQL kald fortaget på en side, når det kommer til spørgsmålet om funktionalitet afviklet over en periode.

Det er simpel matematik:
Et kald foretaget i time er lang mere at foretrække i forhold til et kald foretaget pr. side. Tænk hvis siden bliver læst 100 gange pr. time. Så er der lavet 100 kald i den time modsat et cronjob som kun kaldes én gang pr. time.

Men når det er sagt, kan man med lidt SQL magi lave en "stored procedure" og afvikle denne hver gang siden kaldes. Så er det kun databasen der trækker load. Ellers er der en anden et-kalds metode og kræver ikke ekstra checks:

"UPDATE users SET points = points + (2 * FLOOR(NOW()-lastupdate / 86400)), lastupdate = NOW() WHERE id IN (SELECT id FROM tables WHERE NOW()-lastupdate > 86400)"

Den er lidt teoretisk skrevet, men burde virke. Ellers må den omskrives til to kald.



Indlæg senest redigeret d. 10.04.2008 01:13 af Bruger #10216
Har bare lige en ekstra ting at tilføje:

"Lav et script der tjekker, hvor lang tid der er gået siden hans sidste login, og så giv ham 2 points for hver 24. time."

Giver det ikke et problem hvis folk logger ind et par gange om dagen. Så er der IKKE gået 24 timer. Lad os sige at en person lige er inde og tjekke om aftenen, og dernæst tjekker morgenen efter. Der er ikke gået 24 timer der så, og hans seneste login vil dernæst blive opdateret. Hvis det mønster fortsætter, får han jo slet ikke point :)



Giver det ikke et problem hvis folk logger ind et par gange om dagen. Så er der IKKE gået 24 timer. Lad os sige at en person lige er inde og tjekke om aftenen, og dernæst tjekker morgenen efter. Der er ikke gået 24 timer der så, og hans seneste login vil dernæst blive opdateret. Hvis det mønster fortsætter, får han jo slet ikke point :)

Jo det kan det gøre. Det man kunne gøre i stedet er at tjekke om brugeren har logget ind i dag, og hvis ikke give ham point svarende til antallet af dage sinden han sidst var på. Her gemmer du bare dag og måned, og så er der ikke mere der.



Hvis det er fast antal points. nu siger vi 2 om dagen.
ligemeget om brugeren logger ind...

kunne man så ikke bare.

tog lige en kode fra hvor længe har jeg levet scriptet
Fold kodeboks ind/udKode 


og så gange antal dage med 2 ?

altser start dag til NU. gange 2...
eller har jeg misforstået noget :P



Indlæg senest redigeret d. 23.04.2008 00:52 af Bruger #11875
Men er det nu også en besparelse kun at opdatere når en brugers point skal vises?.
Man kan vel spekulere i hvad der billigst. At lave et system der for hver gang en brugers point skal vises bliver nød til at teste og opdaterer denne brugers points eller simpelthen at lave et cron job der en gang i timen kører et query der ligger point til alle brugere.

den første kræver 1 select,1 test og muligvis 1 update hver gang en brugers point skal vises.

den anden kræver 1 update query i timen og 1 select når brugerens points skal vises.



Indlæg senest redigeret d. 09.04.2008 10:43 af Bruger #5620
Kan godt se at den første løsning er at foretrække hvis man kun viser points i en eller anden obskur side som alligevel storset aldrig bliver besøgt. Men så kan man jo begynde at spekulere i om man ikke lige så godt kan afskaffe points helt.

Men et andet spørgsmål bare for sjovt er hvordan ville du lave f.eks. en top hundred i det første system?



t