Sessions

Een session is vernoemd naar een gebruikerssessie, de periode waarin een gebruiker actief een website bezoekt. Hij wordt geinterpreteerd als de tijdspanne vanaf het moment dat iemand een website voor het eerst opent tot het moment dat hij de website gedurende X minuten niet meer bezocht heeft.

Implementatie in PHP

Sessions zijn in PHP geimplementeerd als een speciale superglobal array genaamd $_SESSION. Omdat hij superglobal is kun je hem te allen tijde aanroepen vanuit elke plek in je PHP scripts.

Het enige afwijkende in $_SESSION is dat hij persisteert. Wanneer het script stopt wordt de inhoud van $_SESSION opgeslagen op disk op de server. Wanneer de session later weer wordt geopend wordt de inhoud weer geladen uit dat bestand.

Om te onthouden welke session bij welke bezoeker hoort heeft elke session een eigen id, het session-id. Dit Id wordt in de browser opgeslagen via een cookie of meegegeven via de URL. Als PHP in de cookies of URL zo'n session-id tegenkomt zal hij proberen om het bijbehorende bestand van disk te lezen.

Als een session langer dan X minuten (dat is instelbaar) niet geopend is wordt hij gewist van disk.

$_SESSION is dus de session en in die array zitten waarden die je sessionvariables zou kunnen noemen, maar het zijn gewoon elementen van de $_SESSION array en er is niets speciaals aan.

Werkwijze

Een session starten

Je start een session met session_start().

Deze functie probeert onder andere cookies te setten, daarom mag je hem niet uitvoeren nadat je al html hebt verstuurd. Een goede gewoonte is om session_start() als eerste in je script te plaatsen.

Waarden in een session zetten

$_SESSION is gewoon een array dus waarden erin zetten doe je letterlijk hetzelfde als bij een gewone array:

1
$_SESSION['naam__van_de_waarde'] = 'hallo';

Waarden uit een session lezen

Omdat het nog steeds een gewone array is behoeft dit nauwelijks uitleg:

1
echo $_SESSION['naam_van_de_waarde'];

Een naam aan een session geven

Het is mogelijk om een session een naam te geven. Standaard heet een session: "PHPSESSID".
De nieuwe naam mag alleen uit letters en cijfers bestaan.

Zo haal je de huidige naam op. (Let op dit moet je elke keer gebruiken voordat je de session oproept. Dit omdat bij het opstarten van de session hij zijn orginele naam krijgt.

1
2
session_name(willekeurigenaam); 
session_start()

Map bepalen waar de session moet worden opgeslagen

Om zelf te kunnen bepalen waar de sessions moeten worden opgeslagen gebruik je de volgende functie. Deze functie kan ook worden gebruikt om op te zoeken waar de sessions nu worden opgeslagen. De functie moet worden aangeroepen voor session_start()

1
session_save_path()

Veelgestelde vragen

  • Is het mogelijk om exact te bepalen wanneer iemand een website verlaat?

Nee, punt. Een browser heeft geen permanente verbinding met de server en de server kan dus ook op geen enkele maner erachter komen wat de browser aan het doen is. Er zijn routines die het proberen, door te kijken naar de URL die in de browser wordt geladen, maar dat is een slechte methode omdat vooral ervaren surfers regelmatig tussendoor even wegsurfen om b.v. hun email te controleren. Als jij hen dan meteen uit het systeem gooit dan zal man dat niet erg waarderen.

  • Is het mogelijk om een actie uit te laten voeren wanneer een sessie verloopt?

In de huidige versies van PHP niet. Of dat ooit nog komt is niet duidelijk.

  • Kan ik ook meerdere sessies tegelijk openen?

Nee, want dat hoeft niet. $_SESSION is een array dus je kunt er zoveel dingen in kwijt als je wilt

  • Hoeveel kan ik in een session zetten voordat het te traag wordt?

'Veel' is relatief, maar ga er geen bestanden van honderden kilobytes in zetten.
100 variabelen is niet 'veel'.

  • Kan ik een sessie ook helemaal weggooien?

Als je bedoelt dat je één waarde uit $_SESSION wilt halen: ja dat kan, gewoon zoals met elke array: unset();

Als je bedoelt dat je heel $_SESSION tegelijk weg wilt gooien; Ja dat kan, met session_destroy(), maar:
De vraag is echter of dat een goed plan is. Deze vraag wordt veel gesteld door mensen die sessions gebruiken om gebruikers aan te loggen op hun website. Het uitloggen willen ze dan steevast doen door de hele session te vernietigen onder het motto: ik wil niets meer van die persoon weten. Dat is niet nodig en zelfs ongewenst en daar zijn twee argumenten voor: 1) of iemand is aangelogd wordt bepaald door de inhoud van $_SESSION, niet door het bestaan van $_SESSION. Immers, dan is iemand ingelogd als hij een session heeft en je moet hem een session geven om te kunnen controleren of hij aangelogd is. Zet gewoon een variabele in de sessie en bepaal aan de hand van de waarde van die variabele of iemand wel of niet is ingelogd. Als iemand uitlogt zet je alleen die ene variabele op '0' en poef, men is uitgelogd.
2) sessions zijn niet alleen voor het aan- en uitloggen. Je kunt er veel meer in opslaan zoals welke topics de bezoeker de afgelopen vijf minuten heeft gezien, welke lettergrootte hij wil gebruiken etc. Voor niet-ingelogde gebruikers kun je dat niet in een database zetten (je weet niet over wie het gaat) maar je wilt het wel tijdens zijn bezoek onthouden. Als de bezoeker inlogt en uitlogt hoeft die data niet ineens te verdwijnen, dus vernietig je de sessie niet.

Overkoepelende artikelen:
Inloggen wachtwoord vergeten? Aanmelden