onbeforeunload and onunload
Ik zit met een probleem. Ik moet bij het afsluiten van mijn browser of bij het veranderen naar een andere pagina een php pagina uitvoeren. Dit doe ik a.d.h.v. een ajax_do. Nu is het zo dat hij dit soms doet en soms ook niet. Dus soms voert hij het script uit maar 1/5 keren doet hij het niet. Hoe kan ik dit eventueel oplossen?
en weetje de reden waarom het soms niet werkt
kun je niet gewoon op de volgende pagina je script uitvoeren?
dit zet ik in de body:
onbeforeunload="close();" onunload="close();"
---- dit is de javascript vandiezelfde pagina ------
Code (php)
------ pagina close -----
Code (php)
1
2
3
4
5
2
3
4
5
<?php include('inc_connect.php');
$id = $_GET['id'] ;
$query= "UPDATE requirements SET req_opened='0' WHERE req_id='".$id."'";
mysql_query($query) or die (mysql_error());
?>
$id = $_GET['id'] ;
$query= "UPDATE requirements SET req_opened='0' WHERE req_id='".$id."'";
mysql_query($query) or die (mysql_error());
?>
erg groot is de code niet
onbeforeunload="close();" onunload="close();"
dit zet:
onbeforeunload="return false; close();" onunload="return false; close();"
dan breek je alle andere bewerkingen af die normaal uitgeoverd worden. dan kun je net even wat makkelijker debuggen (kijken welke waarde terug wordt gegeven bijvoorbeeld.)
thx
Je kunt mijn code van google code af halen. source code
Je kan ook de pagina iedere 30 seconden o.i.d. een melding laten doen dat het bestand nog steeds gelockt moet zijn. Bij die requests update je dan een regel in je database met de huidige datum/tijd. Is die datum/tijd meer dan 60 seconden geleden, dan wordt het document op dat moment blijkbaar niet bewerkt, en is het geünlockt.
Wat wil je bereiken met het script?
Jelmer schreef op 28.05.2009 16:20:
Je kan ook de pagina iedere 30 seconden o.i.d. een melding laten doen dat het bestand nog steeds gelockt moet zijn. Bij die requests update je dan een regel in je database met de huidige datum/tijd. Is die datum/tijd meer dan 60 seconden geleden, dan wordt het document op dat moment blijkbaar niet bewerkt, en is het geünlockt.
Is niet handig. Dat creëert enorm veel server load, zeker met meer gebruikers.
termination schreef op 01.06.2009 19:26:
Is niet handig. Dat creëert enorm veel server load, zeker met meer gebruikers.
Apache en PHP hebben er niet zoveel problemen mee, grootste zorg is al de UPDATE queries die MySQL moet verwerken. Op een server waar ik deze methode gebruik was dat het probleem, en ik heb het opgelost door een daemon in PHP te schrijven (ja, het kan echt! :P) en dat lijkt erg goed te werken. Gemiddeld handelt hij 100 gebruikers tegelijkertijd (met 10 of minder seconden interval) af en dat is geen enkel probleem.
termination schreef op 01.06.2009 19:26:
Is niet handig. Dat creëert enorm veel server load, zeker met meer gebruikers.
Jelmer schreef op 28.05.2009 16:20:
Je kan ook de pagina iedere 30 seconden o.i.d. een melding laten doen dat het bestand nog steeds gelockt moet zijn. Bij die requests update je dan een regel in je database met de huidige datum/tijd. Is die datum/tijd meer dan 60 seconden geleden, dan wordt het document op dat moment blijkbaar niet bewerkt, en is het geünlockt.
Is niet handig. Dat creëert enorm veel server load, zeker met meer gebruikers.
Dat valt reuze mee, je hoeft ook echt niet gigantisch veel data te versturen, en die server hoeft ook niet gigantisch veel uit te voeren (misschien wel als de gebruiker weg is).
Je weet nooit, maar dan ook NOOIT of je iets uitbereid.
ook al is het niet veel data, en hoeft de server niet veel te doen ,het blijft load.
En met 1 gebruiker zal het geen probleem zijn, met 100 misschien ook niet maar met meer zal je het toch gaan merken.
Je kan ook een andere techniek gaan implementeren, maar ik zou geen alternatief weten dat beter werkt voor deze toepassing (bijhouden of iemand nog op je website zit)
Toch blijf ik het vreemd vinden dat onbeforeunload niet werkt.
Als ik het hier probeer met dezelfde code word alles netjes weggeschreven.
misschien iets vaags in de server of client????
Normaal, omdat HTTP stateless is, is dat geen probleem. Maar de TS wil hier 'state' introduceren, namelijk het locken van een document. Het lijkt mij vrij essentieel dat dat document weer geopend wordt, zo essentieel dat je daarvoor niet afhankelijk van wilt zijn van de client.
Daarom lijkt mij polling in plaats van zo'n event-achtige opbouw een veel veiliger idee. En zolang de website klein blijft, is dat geen probleem. Dat is aan de TS om te beslissen. Hoe groot is de kans dat zijn website zo groot wordt dat hij moet gaan nadenken over load? Ik denk dat maar een heel miniem deel van alle websites die hier met de hulp op PHPhulp worden gemaakt bekend zullen worden.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Als je voor de oplossing met polling gaat doe ht dan alsjblieft maar eens in de zoveel minuten met een cronjob. gewoon een PHP file op de server uitvoeren, scheelt een hoop requests.
Als iemand anders dat document dan wilt gebruiken, dan kan de server kijken of de tijd groot genoeg is.
Stel dat de client iedere 5 minuten tegen de server zegt dat hij nog bezig is, en ook probeert om bij onunload te melden dat hij klaar is. In het beste geval hoeft de volgende gebruiker die datzelfde bestand wil bewerken zo goed als niet te wachten. In het ergste geval moet hij 5 minuten wachten, totdat de tijd die de eerste client had gereserveerd door te pollen is verlopen.
maar waarom zou de client elke zoveel minuten de server moeten pollen??
Dat is toch het hele punt.