Maison >développement back-end >tutoriel php >Rédaction de gestionnaires de session personnalisés
Les sessions PHP résolvent l'apatrise inhérente du Web, permettant des fonctionnalités telles que les paniers d'achat, le suivi des visites de sites Web et la surveillance de la navigation utilisateur. Bien que la gestion de session par défaut de PHP suffit dans la plupart des cas, les solutions personnalisées offrent des fonctionnalités élargies et un stockage alternatif de données. Cet article explique le mécanisme par défaut et montre comment le remplacer pour la gestion de session personnalisée.
Concepts clés:
serialize()
, unserialize()
) reste la méthode de traitement des données par défaut, quel que soit l'emplacement de stockage. session_set_save_handler()
vous permet de remplacer le gestionnaire de session par défaut. Il a besoin de six fonctions de rappel: ouverture de session, fermeture, lecture, écriture, destruction et collection de déchets. SessionHandlerInterface
, fournissant des méthodes pour chaque étape du cycle de vie de session. session.gc_probability
et session.gc_divisor
dans php.ini
. Comprendre le stockage de session par défaut:
Avant de créer un gestionnaire personnalisé, comprenez le comportement par défaut de PHP. Les données de session sont stockées dans des fichiers individuels sur le serveur, chacun lié à un ID unique (stocké dans un paramètre de cookie ou d'URL de navigateur). PHP utilise cet ID pour récupérer des données sur les demandes suivantes.
pour trouver le répertoire de données de session:
<?php echo session_save_path(); ?>
Vous pouvez modifier ce chemin dans php.ini
ou utiliser session_save_path("/path/to/session/data");
. Le stockage des données de session en dehors du répertoire de racine Web améliore la sécurité.
Les fichiers de session (nommés "SESS_" suivis de l'ID de session - obtenu via session_id()
) contiennent des données sérialisées. Par exemple, le stockage $_SESSION["colors"] = array("red", "blue");
se traduit par un fichier contenant:
<code>colors|a:2:{i:0;s:3:"red";i:1;s:4:"blue";}</code>
Cette sérialisation est cohérente même avec les gestionnaires personnalisés; Vous modifiez où Les données sont stockées, pas comment elle est gérée.
Le cycle de vie de session et session_set_save_handler()
:
session_start()
ouvre le fichier de session et charge les données dans $_SESSION
. Les données sont enregistrées lorsque le script se termine (ou via session_write_close()
). session_set_save_handler()
permet de remplacer cela avec des rappels personnalisés pour:
Chaque étape du cycle de vie nécessite une fonction de rappel enregistrée; Sinon, PHP émet un avertissement. Les rappels peuvent être des fonctions, des fermetures, des méthodes d'objet ou des méthodes de classe statique.
Construire un gestionnaire personnalisé (exemple MySQL):
Cet exemple utilise une base de données MySQL pour stocker les données de session. La table de la base de données doit avoir des champs pour l'ID de session, les données et le dernier temps d'accès:
<?php echo session_save_path(); ?>
Les fonctions suivantes démontrent les six rappels, en utilisant PDO pour l'interaction de la base de données:
<code>colors|a:2:{i:0;s:3:"red";i:1;s:4:"blue";}</code>
N'oubliez pas de remplacer les informations d'identification de la base de données d'espace réservées par la vôtre. Cet exemple fournit un cadre de base; La gestion des erreurs et les interactions plus robustes de la base de données doivent être ajoutées pour l'utilisation de la production. La gestion des données dans read
et write
peut être adaptée pour répondre aux besoins spécifiques (par exemple, des données non désérialisées avant le stockage).
Conclusion:
Les gestionnaires de session personnalisés offrent une flexibilité et un contrôle sur la gestion des sessions. Cet article a démontré une solution basée sur MySQL; Les mêmes principes s'appliquent à d'autres mécanismes de stockage. N'oubliez pas de gérer correctement la sérialisation / désérialisation et implémentez les mesures de gestion des erreurs et de sécurité appropriées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!