Avatar billede jenzentm Nybegynder
11. april 2004 - 14:12 Der er 33 kommentarer

Køre en phpfil når man skifter side eller lukker iexplore

Hejsa. Jeg har brugt følgende metode til at køre en fil når man lukker browseren eller man browser til en ny side:

<html>
<head>
<script type="text/javascript">
  function doLogOff()
  {
      i = new Image();
      i.src = 'logout.php';
  }
</script>
</head>
<body OnUnload="doLogOff();">
nothing
</body>
</html>

Problemet er at den ikke når at loade siden før browseren lukker eller skifter side.

Det er meget vigtigt at den kører HELE den side som billedet refererer til inden den skifter side eller browseren lukker.

Kan det klares med en preloader eller lignende?

Det må IKKE være en popup for den bliver blocket af popupblockere og det er ikke meningen. Siden skal køre fuldt ud.

[]JenZen
Avatar billede jenzentm Nybegynder
11. april 2004 - 14:13 #1
Forresten har jeg prøvet med OnBeforeUnload. Det virker ikke.

[]JenZen
Avatar billede boris Mester
11. april 2004 - 14:16 #2
popopblockere skal jo netop hindre den slags som du vil gøre
Avatar billede jenzentm Nybegynder
11. april 2004 - 14:17 #3
forhindre at man logger ud af siden? I don't think so. Det er lige præcis det at popup blocvkere IKKE skal blokke. Det er jo ikke en reklame. hehe.

[]JenZen
Avatar billede boris Mester
11. april 2004 - 14:19 #4
Du kan jo kun bede serveren om at køre en fil ved at requeste en ny side.
Men du kan i stedet omdirigere brugeren til den side, som dit program ligger på, og derfra hen til den nye side. Det virker bare kun, hvis brugeren gør som du vil have ham/hende til
Avatar billede jenzentm Nybegynder
11. april 2004 - 14:23 #5
hvordan vil du så gøre det? rent kodemæssigt? Du kan jo ikke køre en php funktion OnUnload.

[]JenZen
Avatar billede boris Mester
11. april 2004 - 14:28 #6
Du vil i virkeligheden narre brugeren hen på en anden side, når brugeren faktisk har valgt at forlade din side.
I princippet ikke meget anderledes end et popopvindue, som jo er noget der sker imod brugerens vilje.
Så hvis brugeren suspenderer popop rammer det også dig
Avatar billede dennismp Nybegynder
11. april 2004 - 14:30 #7
At bruge javascript er lidt farligt, folk har slået det fra.. Så er de aldrig logget af?

Hvad med, at hver gang du ser brugeren så gemmer du tidspunktet for sidste hit. Så kan du lave et check andetsteds, der "logger folk af", hvis de ikke har været aktive en f.x 15minutter.

Du kunne også lave en session-handler, og så implementerer din logoff-funktion i garbagecollectoren.
Avatar billede boris Mester
11. april 2004 - 14:37 #8
Problemet med dennismps løsning er bare, at det ikke registreres sm hændelse, at siden faktisk lukkes. Nedtællingen starter når siden åbnes og ikke når den lukkes.
Avatar billede dennismp Nybegynder
11. april 2004 - 14:41 #9
Ja,men det er en generel "problem" med stateless protokoller.. Du ved ikke hvornår folk logger af. Så man må antage at folk laver hits inden for x minutter og tage den usikkerhed med.

At på JS er ikke bedre. Det kræver
a) brugeren tillader JS
b) at det virker i browseren (ikke alle bruger IE)
c) hvad hvis man lader sin computer stå i 2 timer? Så er man stadig online? Eller 4 dage?
Avatar billede boris Mester
11. april 2004 - 14:41 #10
Du kunne evt. også lave det i ASP og bruge session slukkontakten til at køre filen?
Hvis du derudover havde en lille bitte iframe på siden som opdaterede sig selv hvert 2. minut, kunne du sætte sessiontimeout til 3-4 minutter dvs at filen ville blive kørt max 4 minutter efter at siden var lukket ned
Avatar billede boris Mester
11. april 2004 - 14:46 #11
Til det sidste fra dennismp>> Jo, det bestemmer programmøren altså også. Man kan jo sætteen betingelse, som lukker session ned under alle omstændigheder efter 4 timer eller 44 timer. Hvis man vil.
Undskyld jeg skiftede spor til ASP, men umiddelbart virker det for mig som det eneste der næsten 100 % løser opgaven og rimeligt enkelt endda?
Avatar billede dennismp Nybegynder
11. april 2004 - 14:49 #12
Kan ikke lide iframe løsningen, men det er da en mulighed :)

Mit c-puntk var mere til brugen af javascript (redirect til logo ved lukning af vinduet). Det var det jeg (troede) jeg svarede på.

Det med at bruge "session slukkontakten i asp" svarer til garbage collection i en sessionhandler - derfor foreslog jeg det.
..nu mangler vi bare lidt kommentarer fra jenzentm :)
Avatar billede jenzentm Nybegynder
11. april 2004 - 15:00 #13
hmmm. Ja det var jo en frygtelig masse ;-) Det gør ikke noget at der bruges javascript da siden kun laves kompatibel til IE. Og hvis de ikke har IE følger der et lille klient program med til siden men en IE lignende dll fil som understøtter css, javascript osv.

Iframes = Ikke godt. Det understøttes sikkert ikke en gang af vores dll.

Vi bruger allerede sessions på siden, men vi bruger også mysql som lagrer at de er logget ind. Men det kunne vi måske droppe. Skal ikke lige kunne svare på hvorfor vi har brugt det for vi har 53 php sider efterhånden. Men jeg kigger lige på det og så svarer jeg tilbage om ca. 2 timer. Det lyder nemlig temmelig interessant det med sessionhandling.

Back in 2 hours.

[]JenZen
Avatar billede jenzentm Nybegynder
11. april 2004 - 16:07 #14
Hej igen. Har fået det til at virke. Skulle bare droppe min table der indeholdte de logins der er. Men jeg skal lige have en ting på det rene. Når man lukker sin internet explorer så forsvinder ens session fra siden ikke?

Forresten vil jeg gerne høre jeres ide med denne der garbage collector. Lyder som noget der kunne gøre det endnu bedre.

[]JenZen
Avatar billede dennismp Nybegynder
11. april 2004 - 16:17 #15
Nej.

Når du lukker IE, fjernes cookien med session-id'et. Men serveren ved ikke noget om dette. Så session-handleren kører indimellem (alt efter opsætning) og ser om nogle af session-id er expired. Hvis de er, så slettes de. (Dette kaldes for garbage collection - den fjerne alt det ubrugte).

se http://dk.php.net/manual/en/function.session-set-save-handler.php
her kaldes garbage collection for gc i eksemplet. Du kan evt bruge mysql til at gemme dine session i, hvis du syntes det er nemmere.
Avatar billede jenzentm Nybegynder
11. april 2004 - 16:20 #16
hehe. Ja men nu kommer problemet igen. Jeg kan jo ikke få en side til at køre når de lukker internet explorer eller browser videre. Dermed kan jeg ikke gemme noget i en mysql for den kan ikke slette det igen hvis de browser videre eller lign. Jeg er helt på herrens mark her. Desuden er jeg nødt til at køre en mysql database som får slettet sine entries når man hopper videre tli en ny side eller lukker sin browser. Men jeg aner ikke hvordan jeg skal gøre det så jeg er 110% sikker på at den sletter det HVER gang.

HJÆLP! hehe

[]JenZen
Avatar billede dennismp Nybegynder
11. april 2004 - 16:27 #17
Jo du kan sagents putte noget i mysql. For din session-handlers gc bliver kaldt indimellem (automatisk). Så løber du dine sessions igennem og slette dem der er for gamle, og får dermed ryddetop.. På manualsiden er det eksempler på hvordan du laver det med mysql.

Nu da du kan lave din egen garbage collector, så kan du jo lave noget ved brugeren før du sletter hans session-data (det du normalt ville have gjort i logout.php)
Avatar billede jenzentm Nybegynder
11. april 2004 - 16:43 #18
ja ok. Men. Du er vel nødt til at kalde din garbage collector når useren skifter side eller lukker sin IE. Det kan man vel kun med onunload eller lignende til en ny side, og så ender jeg jo op med samme resultat. Ellers har jeg bare ikke forstået det rigtigt ;-)

[]JenZen
Avatar billede dennismp Nybegynder
11. april 2004 - 17:09 #19
Du, som programmør, behøver ikke at bekymre dig om at kalde garbagecollectoren. Det gør php/apache for dig. :)
Avatar billede boris Mester
11. april 2004 - 17:12 #20
Som tidligere sagt kan serveren udelukkende se, når klienten åbner en side. Man kan ikke se når siden lukkes. Så enhver form for timeout vil være i forhold til sidste gang en side blev kaldt.
Avatar billede boris Mester
11. april 2004 - 17:15 #21
M.a.o. er du nødt til at sætte en timeout så højt du ikke vipper en bruger af, der ikke er blevet færdig med siden.
Avatar billede boris Mester
11. april 2004 - 17:17 #22
Du kan evt. gøre som bankerne og efter 10 minutter spørge brugeren, om vedkommende stadig ønsker at fortsætte.
Avatar billede dennismp Nybegynder
11. april 2004 - 17:24 #23
Det kan da kun gøres ved javascript (?) eller andet clientside.

Jeg syntes vi går i ring :-|
Avatar billede boris Mester
11. april 2004 - 17:30 #24
Ja ganske rigtigt. Javascript eller VB script eller appletter. Du har som sagt ingen jordisk anelse om hvad klienten laver og hvis du efter f.eks. 10 minutter gerne vil vide det,  så er du nødt til at spørge, lige som bankerne gør.

Jo ringen er vist sluttet.
Avatar billede jenzentm Nybegynder
11. april 2004 - 18:00 #25
hmmm. Jeg synes at det der kode der er inde på deres manual er et stort rod. Hvorfanden er alle de variabler defineret henne? Jeg fatter hat af hvad det der er der inde skal betyde. Hvis du ville forklare dennis ;-)

[]JenZen
Avatar billede dennismp Nybegynder
11. april 2004 - 18:12 #26
Prøv denne istedet
http://www.zend.com/zend/spotlight/code-gallery-wade8.php

Den tager også udgangspunk i mysql, så det kan være du kan stjæle det meste derfra
Avatar billede jenzentm Nybegynder
11. april 2004 - 18:22 #27
Jeg nærlæser lige denneder zend article i nat og så skriver jeg lige igen hvis der er noget jeg er i tvivl om. Under alle omstændigheder skal jeg nok vende tilbage for der skal jo også lige deles lidt points ud. Det var lidt at en nød at knække denneher ikke at forglemme. Nå men vi snakz lige senere. ;-)

[]JenZen
Avatar billede jenzentm Nybegynder
12. april 2004 - 00:45 #28
ok. Den blev jeg bare mere forvirret af. Hvad fanden gør alle de andre sider? fx. eksperten.dk? Hvad gør alle de sider? De må sq da kende svaret. Det burde ikke være så advanceret. Det kan ikke passe.

[]JenZen
Avatar billede dennismp Nybegynder
12. april 2004 - 00:49 #29
De logger inaktive brugerer ud ved at deres session udløber.

Hvad er det egenlig du prøver at lave? Hvorfor skal logout.php køres?
Avatar billede jenzentm Nybegynder
12. april 2004 - 01:10 #30
OK. Here goes nothing. Nu får du den vilde beskrivelse.

Jeg er ved at lave en stor side med en kammerat som skal huse forum, chat, news section m.m. og det skal altsammen køres under det login man bruger. I et forum ved vi alle at vi gerne vil have data om hvorledes brugeren er offline eller online. Det har alle forums. Derfor kan jheg ikke nøjes med at bruge sessions.

Det første jeg gør når brugeren logger på er selvfølgelig at checke om det er et rigtigt password han har brugt og om brugeren i det hele taget eksisterer. Når dette er gjort skrives hans brugernavn, login tidspunkt m.m. til nogle $_SESSION variabler. Derudover er jeg nødt til at skrive til min mysql at denne bruger er på og er logget på på dette bestemte login tidspunkt m.m. Disse data skal jeg som tidligere nævnt fx bruge til forummet. Denne del er intet problem. Problemet er logud.

Nu kunne man jo selvfølgelig sagtens sige at jeg bare kunne lave den GC funktion således at den automatisk slettede hans database entry efter et stykke tid. MEN. Så bliver hans status jo ikke sat til offline før efter et stykke tid når den kører garbage collectoren. Jeg ville jo helst at denne blev sat til offlinbe med det samme.

Alternativet lyder til at når useren logger på skriver jeg session id, username, online status, plus mine andre ting jeg vil have med til databasen. Når de så har været væk i tilstrækkelig tid og GC kører skriver den til databasen at den session id er logget ud. Hvis useren så kommer tilbage og logger på inden den kører GC vil hans session id bare blive opdateret. Hvis altså en ny er blevet assigned til ham.
Men denne model er kun god hvis gc efter standard kører rimelig tit. Men jeg ved ikke om man selv kan bestemme hvor tit den kører ved hjælp af en funktion?

[]JenZen
Avatar billede dennismp Nybegynder
12. april 2004 - 01:22 #31
Alle de steder jeg har set en online-funktion, så er det lavet på samme måde. Man registerer hvornår man sidste har set dem (deres sidste hit) .. og hvis de ikke har været aktive i x minutter så er de offline. Det er den eneste måde du kan gøre det, uden at være afhængigt af noget clientside.

Så når du ser at der er 7 bruger online, så burde der egenlig står at der sandsynligvis er 7 bruger online :)

Søgte lige hurtigt efter en tutorial:
http://www.udvikleren.dk/article.php?aid=148&techid=6
Denne gør det på samme måde, jeg er ret sikker på at det er måden.

Om man gør det igennem sessions eller ej er egenlig underordnet, ideen er jo den samme.
Avatar billede boris Mester
12. april 2004 - 07:16 #32
Det er jo med sessions som med mennesker.
Når du siger at din onkel Birger er i live, mener du, at han var i live sidst du tjekkede det, men han kan være kørt over af en sporvogn for 2 minutter siden.Hvert livstegn er en opdatering, ind imellem går du bare ud fra det.

Og 7 brugere online = max 7 brugere online
Hvor online er lidt af en overdrivelse.

Skal det være rigtigt online kommunikation, må du enten sætte siden til at opdatere sig selv meget hyppigt eller bruge noget helt andet end HTML, lave din egen applikation som kommunikerer direkte med serveren på en eller anden port og lade brugerne installere denne applikation.

Microsoftice Mæsinger er hvad jeg ville kalde online; ikke en webside med sessions der timer ud efter et kvarter.
Avatar billede nikolajdu Nybegynder
12. april 2004 - 12:31 #33
Ej men Eksperten er jo gået hen og blevet helt poetisk.... ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester