Drupal kent heel nette sessie-afhandeling waar je als ontwikkelaar handig gebruik van kunt maken.
Met sessie-variabelen kun je tijdelijke waardes bij één gebruiker opslaan; welke PHP over meerdere requests beschikbaar heeft.
Drupal core gebruikt sessie-variabelen bijvoorbeeld om met drupal_set_message() een tekst klaar te zetten, die de eerstvolgende keer dat deze gebruiker een pagina opvraagt, bovenaan afgedrukt wordt.
Jij kunt dit heel handig gebruiken, om tijdelijk waardes op te slaan, wanneer de gebruiker bijvoorbeeld een vinkje aanvinkte om grotere tekst te zien, of om een uniek bestelnummer te bewaren voor als de bezoeker uit een externe betalingsprocedure weer terugkomt op jou site.
De reden van sessie-variabelen is het gegeven dat HTTP stateless is. Al je PHP-variabelen ben je kwijt, zogauw iemand een pagina ingeladen heeft. Dan wordt immers de verbinding verbroken en sluiten de webserver en PHP alles af, inclusief alle variabelen die je zette.
Maar grote kans dat je gebruiker nog helemaal niet klaar is. Dat deze nog door gaat klikken, een volgend formulier wil invullen of gewoon ingelogd wil blijven.
Wanneer een bezoeker een pagina opvraagt, kun je bij PHP een sessie-id opvragen, dit is een uniek nummer. Het unieke nummer wordt in de browser van de gebruiker bewaard en op aanvraag getoond aan de webserver: aan Drupal dus.
Het nummer komt echter te vervallen op het moment dat de bezoeker zijn browser afsluit (de sessie beëindigt). Om dat nummer toch te bewaren kun je een session-cookie zetten, hierdoor slaat de browser van de gebruiker het sessie-id op op de harde schijf van de gebruiker.
Een sessie-variabele zetten.
Let op: zet nooit $SESSION = 'foo', je overschrijft daarmee alle andere waarden en maakt essentiële stukken Drupal kapot.
Verder is het belangrijk om altijd arrays aan de $_SESSION toe te voegen. Een $_SESSION['foo'] = 'bar' werkt simpelweg niet.
Het uitlezen is ook eenvoudig:
Belangrijk is ook om de variabele te verwijderen als je deze niet meer nodig hebt:
Voordelen van Drupal's implementatie:
En niet
Die laatste is namelijk te generiek en dus mogelijk al in gebruik.
De code is terug te vinden in session.inc.
<?php
$_SESSION['pirate'] = array('hello' => 'Ahoy!');
?><?php
$greeting = $_SESSION['pirate'];
print $greeting['hello'];
?><?php
unset($_SESSION['pirate']);
?>- Na inloggen gaan sessie-variabelen over van de anonieme gebruiker, naar de nu ingelogde gebruiker.
- Sessie-variabelen zijn ook op complexe load-balanced omgevingen beschikbaar. Omdat drupal alle sessies in de database opslaat, in plaats van in een bestand, zoals PHP zelf doet.
- session_start(), session_register(), cookies opvragen cookiedetectie en andere acties zijn allemaal niet nodig: Drupal verzorgt dit.
- Sessie-variabelen zijn veilig voor zogenaamde race-conditions of parallelle threads. Drupal zorgt voor afhandeling van zulke collisies, dus daarover hoeft de ontwikkelaar zich niet langer te bekommeren.
<?php
$_SESSION['piraat_messages'] = array('Harrrr!');
?><?php
$_SESSION['messages'] = array('Harrrr!');
?>
Drupalversie:
Drupal 5 Drupal 6
Reactie toevoegen