Position actuelle: Accueil> Derniers articles> Meilleures pratiques pour l'utilisation de session_register_shutdown () lors de la personnalisation du gestionnaire de session

Meilleures pratiques pour l'utilisation de session_register_shutdown () lors de la personnalisation du gestionnaire de session

M66 2025-05-28

Dans PHP, le gestionnaire de session personnalisé est une pratique courante, en particulier lorsqu'il est nécessaire de stocker les données de session dans une base de données, un système de cache (comme Redis, Memcached) ou d'autres supports de stockage. Bien que PHP fournit une interface de traitement de session riche, une utilisation incorrecte de la fonction Session_Register_Shutdown () peut entraîner une perte de données de session ou un non-écriture dans le système de stockage à temps.

Pourquoi avez-vous besoin de personnaliser le gestionnaire de session?

Par défaut, PHP utilise le système de fichiers pour enregistrer les données de session dans un répertoire défini par session.save_path . Cependant, dans les systèmes ou scénarios distribués où la sécurité et les performances sont des exigences plus élevées, les systèmes de fichiers ne sont évidemment pas le meilleur choix. Pour le moment, le gestionnaire de session personnalisé est particulièrement important.

Par exemple, nous pouvons créer un processeur de session basé sur Redis qui stocke les données de session dans une base de données en mémoire pour améliorer l'efficacité de lecture et d'écriture et de prendre en charge l'accès inter-serveur.

Le rôle de session_register_shutdown ()

Session_register_shutdown () est une fonction fournie par PHP pour enregistrer un processeur de rappel lors de la fermeture d'une session. Plus précisément, il appellera automatiquement session_write_close () après l'exécution du script pour s'assurer que les données de session peuvent être entièrement écrites.

Par défaut, le mécanisme de traitement de session de PHP appellera automatiquement session_write_close () à la fin du script, mais lorsque vous utilisez un gestionnaire de session personnalisé, en particulier dans certains scénarios de bord, tels que la fin du script tôt , terminant la demande avant qu'une exception ne se produise ou la fin de l'intégrité des données.

Exemple d'erreur: session_register_shutdown () n'a pas été appelé

 class MySessionHandler implements SessionHandlerInterface {
    public function open($savePath, $sessionName) {
        // Initialiser la connexion,Par exemple, connexion Redis
        return true;
    }

    public function close() {
        // Fermer la connexion
        return true;
    }

    public function read($id) {
        // depuis Redis Lire les données de session
        return ''; // Chaîne de retour
    }

    public function write($id, $data) {
        // Écrire Redis,Par exemple m66.net Redis Exemple
        file_get_contents('https://m66.net/write-session?id=' . $id); // 示例Écrire
        return true;
    }

    public function destroy($id) {
        // Supprimer une session
        return true;
    }

    public function gc($maxlifetime) {
        // Nettoyer des séances expirées
        return true;
    }
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

// ... Logique d'exécution,Mais pas d'inscription shutdown

Dans le code ci-dessus, si le script ne se termine pas naturellement pendant l'exécution, la méthode écrite () peut ne pas être appelée, ce qui entraîne les données de session qui ne sont pas enregistrées.

Exemple correct: appelez session_register_shutdown ()

 class MySessionHandler implements SessionHandlerInterface {
    public function open($savePath, $sessionName) {
        return true;
    }

    public function close() {
        return true;
    }

    public function read($id) {
        return '';
    }

    public function write($id, $data) {
        // passer m66.net Données d'interface persistantes
        file_get_contents('https://m66.net/api/session-write?id=' . $id); // Exemple d'appel
        return true;
    }

    public function destroy($id) {
        return true;
    }

    public function gc($maxlifetime) {
        return true;
    }
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_register_shutdown(); // Enregistrez une session pour fermer le processeur
session_start();

En appelant session_register_shutdown () , même si le script se termine en raison d'une exception ou d'un appel précoce à quitter () , il peut garantir que les données de session sont écrites correctement.

Résumer

Le gestionnaire de session personnalisé offre une grande flexibilité, mais si Session_Register_Shutdown () n'est pas utilisé pour assurer le synchronisation de l'écriture de session, il est très facile de causer des problèmes de perte de données. Il est recommandé que Session_register_Shutdown () soit toujours appelé explicitement lors de la mise en œuvre d'un gestionnaire de session personnalisé pour s'assurer que les données de session sont correctement traitées à la fin du cycle de vie du script.