login  Naam:   Wachtwoord: 
Registreer je!
 Forum

onclose/onunload of tijd (Opgelost)

Offline Erwt - 02/02/2010 09:35 (laatste wijziging 02/02/2010 11:32)
Avatar van ErwtPHP beginner Hey allemaal,

Ik ben nog steeds bezig met mijn RPG spelletje en stuit weer eens tegen een probleempje aan.

Als ik me niet vergis is het zo dat onclose/onunload niet werkt op 'alle' browsers. Daarom wordt vaak de tijd in de database gezet en als de update langer dan 5 minuten geleden is, dan betekend het dat die persoon uitgelogd is.

Dat is dus het probleem, mensen die 5 minuten stilstaan in mijn spelletje heb ik namelijk liever niet.

Is dit op een andere manier op te lossen?

edit: Had geen idee in welke cat. ik deze moest zetten.
Koen schreef:
In JavaScript dus. 

18 antwoorden

Gesponsorde links
Offline TotempaaltJ - 02/02/2010 10:05 (laatste wijziging 02/02/2010 10:07)
Avatar van TotempaaltJ PHP interesse Bijvoorbeeld met AJAX ofzo elke zoveel minuten een scriptje aanroepen dat de tijd in de database update, zodat de db up to date blijft 

Edit: En als je geen antwoord krijgt van dat scriptje, kan je het proberen met een iframe, maar da's niet zo mooi.
Offline Ontani - 02/02/2010 11:20
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
kzou dit idd met een timer doen op 5 min, zo snel als die afgaat, sessie vernietigen en melding geven.
Offline Erwt - 02/02/2010 12:42
Avatar van Erwt PHP beginner Bedankt mod, omdat het toch met tijd ging normaal dacht ik dus aan PHP/SQL.. anyways:

Het probleem is, het is in principe een MMORPG.. je kan lopen en andere mensen zien je lopen.. en ik vind dat je een speler die al 5 minuten uitgelogd is niet in-game mag zien. simpelweg omdat een speler denkt dat hij kan communiceren met die speler, maar hij er eigenlijk niet meer is.

Dan moet ik met AJAX elke 5sec een scriptje aanroepen dat de tijd in de database update.. En als de gebruiker dan WEL online is, en hij gaat lopen.. verstuurt hij met AJAX zijn coördinaten en moet ik ook nog eens elke 5 sec de db updaten..

Wordt dat niet traag / vol met problemen?
Offline Ontani - 02/02/2010 14:29
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
je kan ook de jquery unload functionaliteit gebruiken.

$('window').unload = function() {
};
Offline Erwt - 02/02/2010 15:07 (laatste wijziging 02/02/2010 15:07)
Avatar van Erwt PHP beginner En die is wel 100% cross-browser?

Edit: 99% dan 
Offline TotempaaltJ - 02/02/2010 22:44
Avatar van TotempaaltJ PHP interesse
JQuery Docs schreef:
The exact handling of the unload event has varied from version to version of browsers. For example, some versions of Firefox trigger the event when a link is followed, but not when the window is closed. In practical usage, behavior should be tested on all supported browsers, and contrasted with the proprietary beforeunload event.
Nee dus. Eventueel een zogenaamde in-memory database gebruiken, weet ik niet veel van. Volgens miij moet je dan SQLite hebben. Het is sneller, maar slaat het niet definitief op, dus, als niet goed ingesteld, waarschijnlijk dataverlies bij crashes!

Zoals ik al zei: Ik weet er niet veel van, stel mij geen vragen, niet mijn schuld als ik het fout heb 
Offline Ontani - 03/02/2010 08:33
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
In combinatie met de beforeunload event zou het dus wel moeten lukken.

Test pagina opzetten en doorgeven aan iedereen hier.
Offline Erwt - 03/02/2010 08:41
Avatar van Erwt PHP beginner onbeforeunload werkt goed bij IE van 4 tot 8 als ik alles op internet mag geloven en bij firefox werkt hij ook, dit is goed genoeg voor mij.

Wel zit ik met het probleem om op dat punt een AJAX functie uit te voeren, ik weet het niet zeker maar ik heb het gevoel dat als ik een AJAX functie uitvoer op onbeforeunload of onunload dat de pagina dan sneller weg is dan dat AJAX zijn werk kan doen.
Offline Ontani - 03/02/2010 08:43
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
De request zal uitgevoerd worden, je hoeft niet persé te wachten op een respond, zo snel als de request naar de php uitgevoerd is dan ben je niet meer afhankelijk naar de client en kan de browser gewoon gesloten worden.
Offline Erwt - 03/02/2010 10:34
Avatar van Erwt PHP beginner En toch pakt hij hem vaak niet, misschien is het een idee om een waarde te retourneren.. zodat er een popup komt dat het scherm gesloten wordt. dan duurt het nog wat langer en dan kan ik zien waar het aan ligt.. Of dit in de praktijk ook werkt zullen we vanavond zien Als ik een waarde terugkrijg van AJAX alert ik deze, maar misschien is daar ook geen tijd voor haha.

Zal vanavond even proberen, dankje
Offline Jelmerholland - 03/02/2010 19:58
Avatar van Jelmerholland PHP beginner Kan dit niet mogelijk met een session? dat je een tijd regestreerd, en wanneer die loopt, dat ie weer terug gezet wordt. een timer van javascript af laten lopen, en waneer die gelijk is aan die tijd+5mins, dat ie dan uit 't spel geschopt wordt?
(niet heel veel verstand van, maar ik denk, laat ik toch maar een suggestie plaatsen, misschien dat je er wat aan hebt  )
Offline Erwt - 03/02/2010 20:20
Avatar van Erwt PHP beginner Dat is het probleem, of het nu een sessie is of niet.. het blijft met tijd en een delay( in dit geval 5 minuten) werken.. en dat is lelijk want zo lang blijft het poppetje dan staan.

Of bedoel je misschien dat je elke X seconden een update geeft aan de server, en dan elke keer in de DB ook de TIJD meegeven, en als hij in 5 sec geen nieuwe request binnen krijgt dan is hij dus uitgelogd..

Bovenstaande is wel een oplossing, maar dan krijg ik dus elke 1/2 sec een query voor het ophalen van spelers in het veld, en dan ook nog eens een update en dan ook nog eens je eigen lopen updaten.. Wordt dat niet wat buggy? zoveel query's..
Offline Jelmerholland - 03/02/2010 22:38
Avatar van Jelmerholland PHP beginner Owh wacht, ik dacht dat je wilde dat de speler na 5 minuten niks doen gekicked werd ;)


Uhm, ik zou 't doen door elke speler een id te geven, je moet je eerst regestreren, zodat je iedereen een vast id heeft. Op het moment dat die inlogt is de tabel: Bijv spelers met kolom id en log, de log een waarde 1, is die uitgelogt, dan wordt die waarde 0 of 2, net wat jij wilt. Dan doe je elke 5secs een check naar je db.

Dan doe je een check met WHERE o.i.d. (leek in mysql) en als die dan 0 is wordt z'n poppetje uit het spel gezet.


Je kan ook de ingelogde mensen naar een apparte tabel schrijven, zodat je alleen maar de online mensen hoeft te checken, sheelt tijd in het checken, is minder delay Dus als die uitgelogd is wordt de log:0, en wordt ie dus DELETE uit de tabel ingelogden oid.

Geen idee of je me nog snapt, geen idee of 't werkt.
Offline TotempaaltJ - 04/02/2010 07:36
Avatar van TotempaaltJ PHP interesse
Jelmerhollan schreef:
Dan doe je elke 5secs een check naar je db.
Dat wil hij dus niet, want dat zou een ernstige db overload veroorzaken.

Offline Erwt - 04/02/2010 08:30
Avatar van Erwt PHP beginner TotempaaltJ,

Niet om je af te zeiken, maar waar heb je deze info vandaan? kan je dit ook schriftelijk bewijzen want ik hoor andere mensen ook heel andere dingen zeggen. Ben benieuwd, bedankt voor het meedenken!
Offline Ontani - 04/02/2010 09:26
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
lol denk je nu echt dat je met elke 5 seconde een kleine query naar een database je server gaat overbelasten?

Een database moet zo'n 200.000 query's per seconden gemakkelijk aankunnen.
Bedankt door: Erwt
Offline larssy1 - 04/02/2010 10:13
Avatar van larssy1 MySQL beginner
Ontani schreef:
lol denk je nu echt dat je met elke 5 seconde een kleine query naar een database je server gaat overbelasten?

Een database moet zo'n 200.000 query's per seconden gemakkelijk aankunnen.

Ahum, dit is 1 van de vele queries,, ben je ervan bewust dan als een spel 20.000 spelers heeft, al deze spelers alleen al enkel deze querie om de 5seconden moeten uitvoeren,, en dit is nog maar 1 van de zoveel queries die moeten worden gedaan..

Wat als er nou 20meer van zulke queries zijn... ;)

Mijn standpunt,, Je kunt nog niet weten wat zijn spel allemaal moet doen.. Deze querie is enkel 1 van de vele..
Offline Erwt - 04/02/2010 11:02
Avatar van Erwt PHP beginner Bedankt ik heb de oplossing al, mijn spel kent geen vele spelers en zal het ook nooit worden.. Het is een oefening voor mijzelf, had ik ook wel gezegd maar is door al die reacties weggevaagd.

Bedankt!
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.24s