PHP Unconference Europe 2015

Utilisation simple

Les sessions sont un moyen simple de stocker des données individuelles pour chaque utilisateur en utilisant un identifiant de session unique. Elles peuvent être utilisées pour faire persister des informations entre plusieurs pages. Les identifiants de session sont normalement envoyés au navigateur via des cookies de session, et l'identifiant est utilisé pour récupérer les données existantes de la session. L'absence d'un identifiant ou d'un cookie de session indique à PHP de créer une nouvelle session, et génère ainsi un nouvel identifiant de session.

Les sessions suivent une cinématique simple. Lorsqu'une session est démarrée, PHP va soit récupérer une session existante en utilisant l'identifiant de session passé (habituellement depuis un cookie de session) ou si aucun identifiant de session n'est passé, il va créer une nouvelle session. PHP va ainsi peupler la variable superglobale $_SESSION avec toutes les données de session une fois la session démarrée. Lorsque PHP s'arrête, il va prendre automatiquement le contenu de la variable superglobale $_SESSION, le linéariser, et l'envoyer pour stockage au gestionnaire de sauvegarde de session.

Par défaut, PHP utilise en interne le gestionnaire de sauvegarde files qui est défini via la directive session.save_handler. Les données de session seront sauvegardées sur le serveur à l'endroit spécifié par la directive de configuration session.save_path.

Les sessions peuvent être démarrées manuellement en utilisant la fonction session_start(). Si la directive de configuration session.auto_start est définie à 1, une session démarrera automatiquement lors du début de la demande.

Les sessions s'arrêtent automatiquement lorsque PHP a terminé d'exécuter un script, mais peuvent être stoppées manuellement en utilisant la fonction session_write_close().

Exemple #1 Enregistrer une variable avec $_SESSION.

<?php
session_start
();
if (!isset(
$_SESSION['count'])) {
  
$_SESSION['count'] = 0;
} else {
  
$_SESSION['count']++;
}
?>

Exemple #2 Retirer une variable de session avec la superglobale $_SESSION.

<?php
session_start
();
unset(
$_SESSION['count']);
?>

Attention

N'utilisez PAS la fonction unset() avec $_SESSION sous la forme unset($_SESSION) sinon, cela rendra impossible l'enregistrement de données dans la session en utilisant la super-globale $_SESSION.

Avertissement

Vous ne pouvez pas utiliser les références sur des variables de session car il n'y a aucune manière faisable de restaurer une référence vers une autre variable.

Avertissement

register_globals va écraser les variables du contexte global dont les noms sont identiques avec les variables de session. Reportez-vous à la documentation sur l'utilisation de l'enregistrement global pour plus de détails.

Note:

Les sessions basées sur un fichier (par défaut en PHP) verrouille le fichier de session lorsqu'une session est ouverte via la fonction session_start() ou implicitement via la directive de configuration session.auto_start. Une fois verrouillée, aucun autre script ne peut accéder au même fichier de session tant que la session n'a pas été fermée par le script l'ayant ouverte, ou tant que la fonction session_write_close() n'a pas été appelée.

Ceci peut être génant pour les sites Web utilisant AJAX et produisant plusieurs requêtes concurrentes. La façon la plus simple pour contourner ce problème est d'appeler la fonction session_write_close() dès lors que les modifications dans la session ont été effectuées, de préférence en début de script. Vous pouvez aussi utiliser un autre gestionnaire de session qui supporte la concurrence.

add a note add a note

User Contributed Notes 4 notes

up
14
AlexFBP
1 year ago
Regardless, if you need to set the header 'Location:' before closing the session; explicitly close the php script with "exit()" or "die()" functions. Remember that when a php script ends, the session automatically are going to be closed.
up
-3
guy at syntheticwebapps dot com
1 year ago
Despite the warning about not being able to use references inside the session space, I've done it in the past and apparently completely successfully. That is, I can do something like this:

<?php
session_start
();
if (!
$_SESSION['favorite']) {
   
$_SESSION['cow'] = "Elsie";
   
$_SESSION['favorite'] =& $_SESSION['cow'];
    echo
"We set cow = '$_SESSION[cow]' and favorite =& cow ($_SESSION[favorite]).<br/>Reload the page to see if both change when one changes later.<br/>";
} else {
    echo
"Having re-entered the session after initial settings were made: cow = $_SESSION[cow] and favorite = $_SESSION[favorite].<br/>";
   
$_SESSION['cow'] = "Bessie";
    echo
"We reassigned cow = $_SESSION[cow] and our restored reference variable favorite = $_SESSION[favorite]<br/>Note the presence of the &s in the var_dump below.<pre>";
   
var_dump($_SESSION);
    echo
"</pre><br/>If you reload, the test will begin again.";
    unset(
$_SESSION['cow'], $_SESSION['favorite']);
   
session_destroy();
}
?>
yields the following after the second request:

Having re-entered the session after initial settings were made: cow = Elsie and favorite = Elsie.
We reassigned cow = Bessie and our restored reference variable favorite = Bessie
Note the presence of the &s in the var_dump below.
array(2) {
  ["cow"]=>
  &string(6) "Bessie"
  ["favorite"]=>
  &string(6) "Bessie"
}
If you reload, the test will begin again.

I've found this ability very useful and storage efficient in the session data.
up
-3
jpleveille at webgraphe dot com
2 years ago
As mentioned in the documentation, using session_write_close() shuts down the session. It is particularly useful if you want to use header('Location: SOMEURL'); to a URL within the same scope of the current script, that will load the session. Why?

When you use this header directive, the browser is requested to redirect the user to the given URL. If that URL is in the scope of the script where header() is called (let's say, same URL), the requested URL "COULD" load the session BEFORE it has actually been shut down in the previous script, and you might end up with the session from the previous request, reverting all modifications to session in the the last script.

<?php
session_start
();

if (!isset(
$_SESSION['hello']))
{
 
$_SESSION['hello'] = 'world';

 
session_write_close();
 
// session is now closed, it's safe to redirect
  // if not closed, $_SESSION['hello'] may not be set properly
  // when loading the page again
  // (in this very case, calls to this script could loop for a while)
 
header('Location: ' . $_SERVER['PHP_SELF']);
}
?>
up
-10
eddie at onefoldmedia dot com
9 months ago
If a session is not saving and you have verified that session_start() is being called, then double check capitalization. $_session can store variables but will not be treated like a session or cause an error.
To Top