De situatie:
Ik heb in een klein iframpje onder aan m'n website een overzichtje gemaakt van de users die zijn ingelogd, met een linkje erbij zodat ze berichten aan elkaar kunnen sturen. Die pagina in dat iframe refreshed elke minuut en doet dan het volgende:
- zet in mysql de timestamp van de user op de huidige tijd (moet hier bij vermelden dat als een user is ingelogd de waarde van het veld online op yes is gezet (voor het overzicht))
- controleert of er een row in de database is waarbij online op yes staat en de timestamp ouder is dan anderhalve minuut, en zo ja: dan wordt online op no gezet (de user wordt dan niet meer in het overzicht weergegeven)
- controleert of er nieuwe berichten zijn (zo ja, dan worden die in een popupje getoond)
omdat de pagina iedere minuut refreshed, zal de timestamp in de database ook ververst worden en daarom weet ik dus dat als die timestamp ouder is dan 1,5 minuut, dat die user ofwel uitgelogd is, of z'n browser heeft gesloten.
Het probleem
Ondanks dat die pagina iedere minuut refreshed (gedaan met een meta-tag) expired de sessie na verloop van tijd. Ik heb proberen te achterhalen hoe dat kwam, maar snap het niet helemaal. wat ik tot nu toe geprobeerd heb (naast php.net doorlezen)
- de timestamp van de sessie_file uitgelezen (je weet wel, /tmp/sess_987ukjdlkj345o3lk34j53l). Het was me al eens eerder opgevallen dat die na iedere klik binnen de site de huidge timestamp krijgt en toen ik die op m'n scherm printe bleek die niet te veranderen met iedere refresh. Wat ik toen gedaan heb is dit stukje code in m'n file gezet:
Het laatste wat ik nu geprobeerd had is om die meta-tag naar een andere file te laten verwijzen, waar ik als enige code de bovenstaande regel in heb staan en weer een redirect - header("Location online.php") terug naar m'n online script. Maar dat helpt ook niets.
Kan iemand me uitleggen waarom die sessie toch expired? zoals ik al zei: ik kan het op php.net nergens vinden. Heb nog aan cookies zitten denken, maar dat moet ook niet uitmaken, want die wordt al zo gezet dat ie pas afloopt als de browser gesloten wordt (heb ik ook nog eens gedubbelchecked)
oh, het is trouwens zo dat online.php zelf als het ware niet verloopt
wat ik bedoel... ik heb in die code opgenomen dat er alleen op berichten gecontroleerd moet worden als er een user_id (opgeslagen in de sessie) bekend is. als ik dus bijvoorbeeld ben ingelogd en 2 uur lang niets doe, en ik krijg opeens een berichtje, dan log ik pas uit op het moment dat dat popupje met het bericht opensprint. Dat popupje heeft dan als het ware in de gaten dat de sessie eigenlijk verlopen is en ipv het bericht krijg ik dan m'n melding dat ik de pagina niet mag bekijken omdat ik niet ben ingelogd. En vervolgens gebeurd hetzelfde met online.php (die heeft dan pas 'in de gaten' dat de sessie expired is)
hoop dat het duidelijk is...
Ik heb in een klein iframpje onder aan m'n website een overzichtje gemaakt van de users die zijn ingelogd, met een linkje erbij zodat ze berichten aan elkaar kunnen sturen. Die pagina in dat iframe refreshed elke minuut en doet dan het volgende:
- zet in mysql de timestamp van de user op de huidige tijd (moet hier bij vermelden dat als een user is ingelogd de waarde van het veld online op yes is gezet (voor het overzicht))
- controleert of er een row in de database is waarbij online op yes staat en de timestamp ouder is dan anderhalve minuut, en zo ja: dan wordt online op no gezet (de user wordt dan niet meer in het overzicht weergegeven)
- controleert of er nieuwe berichten zijn (zo ja, dan worden die in een popupje getoond)
omdat de pagina iedere minuut refreshed, zal de timestamp in de database ook ververst worden en daarom weet ik dus dat als die timestamp ouder is dan 1,5 minuut, dat die user ofwel uitgelogd is, of z'n browser heeft gesloten.
Het probleem
Ondanks dat die pagina iedere minuut refreshed (gedaan met een meta-tag) expired de sessie na verloop van tijd. Ik heb proberen te achterhalen hoe dat kwam, maar snap het niet helemaal. wat ik tot nu toe geprobeerd heb (naast php.net doorlezen)
- de timestamp van de sessie_file uitgelezen (je weet wel, /tmp/sess_987ukjdlkj345o3lk34j53l). Het was me al eens eerder opgevallen dat die na iedere klik binnen de site de huidge timestamp krijgt en toen ik die op m'n scherm printe bleek die niet te veranderen met iedere refresh. Wat ik toen gedaan heb is dit stukje code in m'n file gezet:
PHP:
Dat werkte tot dusver, dat ik de timestamp van die sessie file toen wel zag veranderen. Maar nog steeds expirede m'n sessie na verloop van tijd als ik nergens op klik1
| $_SESSION['login']['keep_alive'] = $_SESSION['login']['keep_alive'] == 0 ? 1 : 0; |
Het laatste wat ik nu geprobeerd had is om die meta-tag naar een andere file te laten verwijzen, waar ik als enige code de bovenstaande regel in heb staan en weer een redirect - header("Location online.php") terug naar m'n online script. Maar dat helpt ook niets.
Kan iemand me uitleggen waarom die sessie toch expired? zoals ik al zei: ik kan het op php.net nergens vinden. Heb nog aan cookies zitten denken, maar dat moet ook niet uitmaken, want die wordt al zo gezet dat ie pas afloopt als de browser gesloten wordt (heb ik ook nog eens gedubbelchecked)
oh, het is trouwens zo dat online.php zelf als het ware niet verloopt
wat ik bedoel... ik heb in die code opgenomen dat er alleen op berichten gecontroleerd moet worden als er een user_id (opgeslagen in de sessie) bekend is. als ik dus bijvoorbeeld ben ingelogd en 2 uur lang niets doe, en ik krijg opeens een berichtje, dan log ik pas uit op het moment dat dat popupje met het bericht opensprint. Dat popupje heeft dan als het ware in de gaten dat de sessie eigenlijk verlopen is en ipv het bericht krijg ik dan m'n melding dat ik de pagina niet mag bekijken omdat ik niet ben ingelogd. En vervolgens gebeurd hetzelfde met online.php (die heeft dan pas 'in de gaten' dat de sessie expired is)
hoop dat het duidelijk is...