Position actuelle: Accueil> Derniers articles> Comment modifier le mécanisme de stockage de session par défaut via sessionIdInterface?

Comment modifier le mécanisme de stockage de session par défaut via sessionIdInterface?

M66 2025-07-04

La gestion de session de PHP est une partie très importante du développement Web, et elle offre aux développeurs la possibilité de stocker et de gérer les données de session utilisateur. Par défaut, PHP utilise des fichiers pour stocker les données de session, mais dans certains cas, les développeurs peuvent vouloir stocker des données de session ailleurs, tels que des bases de données, des systèmes de cache, etc. Pour implémenter ce mécanisme de stockage personnalisé, PHP fournit l'interface SessionIdInterface , ce qui nous permet de contrôler de manière flexible la façon dont les sessions sont stockées.

1. Comprendre SessionIdInterface

SessionIdInterface est une interface introduite dans PHP version 7.4, visant à fournir un moyen de permettre aux développeurs de personnaliser le mécanisme de génération d'ID et de stockage des séances. D'une manière générale, l'ID d'une session PHP est automatiquement générée en interne par PHP et enregistrée dans $ _SESSION . En implémentant SessionIdInterface , les développeurs peuvent personnaliser les méthodes d'acquisition et de stockage des ID de session.

Plus précisément, SessionIdInterface fournit deux méthodes principales:

  • getSessionId () : utilisé pour obtenir l'ID de la session en cours.

  • setSessionId (String $ id) : utilisé pour définir l'ID de session.

En mettant en œuvre ces deux méthodes, les développeurs peuvent contrôler la façon dont l'ID de session est généré, enregistré et lu dans le stockage.

2. Modifiez le mécanisme de stockage de session via SessionIdInterface

Pour modifier le mécanisme de stockage de session par défaut, nous devons implémenter une classe de gestionnaire de session personnalisée, qui implémentera sessionhandlerInterface et combiner ses sessionIdInterface pour fournir une nouvelle méthode de stockage. Voici un exemple simple montrant comment utiliser une base de données pour stocker les données de session:

Étape 1: Créez un gestionnaire de session personnalisé

Tout d'abord, nous devons créer une classe qui implémente SessionHandlerInterface et SessionIdInterface . Cette classe sera utilisée pour gérer le stockage et l'acquisition des données de session.

 <span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">DatabaseSessionHandler</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">SessionHandlerInterface</span></span><span>, </span><span><span class="hljs-title">SessionIdInterface</span></span><span>
{
    </span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$db</span></span><span>;

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$dbConnection</span></span></span><span>)
    {
        </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db = </span><span><span class="hljs-variable">$dbConnection</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">open</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$savePath</span></span></span><span>, </span><span><span class="hljs-variable">$sessionName</span></span><span>)
    {
        </span><span><span class="hljs-comment">// Ici, vous pouvez effectuer la vérification de la connexion de la base de données et d&#39;autres opérations</span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">close</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
    {
        </span><span><span class="hljs-comment">// Fermez la connexion de la base de données</span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">read</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// Lire les données de session de la base de données</span></span><span>
        </span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT session_data FROM sessions WHERE session_id = :session_id"</span></span><span>;
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_id'</span></span><span>, </span><span><span class="hljs-variable">$sessionId</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
        
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetchColumn</span></span><span>();
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">write</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>, </span><span><span class="hljs-variable">$sessionData</span></span><span>)
    {
        </span><span><span class="hljs-comment">// Écrivez des données de session dans la base de données</span></span><span>
        </span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"REPLACE INTO sessions (session_id, session_data) VALUES (:session_id, :session_data)"</span></span><span>;
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_id'</span></span><span>, </span><span><span class="hljs-variable">$sessionId</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_data'</span></span><span>, </span><span><span class="hljs-variable">$sessionData</span></span><span>);
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">destroy</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// Supprimer les données de session dans la base de données</span></span><span>
        </span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"DELETE FROM sessions WHERE session_id = :session_id"</span></span><span>;
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_id'</span></span><span>, </span><span><span class="hljs-variable">$sessionId</span></span><span>);
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">gc</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$maxlifetime</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// Nettoyer des séances expirées</span></span><span>
        </span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"DELETE FROM sessions WHERE last_access &lt; :maxlifetime"</span></span><span>;
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':maxlifetime'</span></span><span>, </span><span><span class="hljs-variable">$maxlifetime</span></span><span>);
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
    }

    </span><span><span class="hljs-comment">// accomplir SessionIdInterface Méthode d&#39;interface</span></span><span>
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getSessionId</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
    {
        </span><span><span class="hljs-comment">// Accès personnalisé Session ID Chemin</span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">session_id</span></span><span>();  </span><span><span class="hljs-comment">// Ou génération de logique personnalisée ID</span></span><span>
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">setSessionId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$id</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// Paramètres personnalisés Session ID Chemin</span></span><span>
        </span><span><span class="hljs-title function_ invoke__">session_id</span></span><span>(</span><span><span class="hljs-variable">$id</span></span><span>);  </span><span><span class="hljs-comment">// Ou une logique personnalisée ID</span></span><span>
    }
}
</span></span>

Étape 2: Enregistrez un gestionnaire de session personnalisé

Dans PHP, nous devons enregistrer un processeur de session personnalisé via la fonction session_set_save_handler () . De cette façon, PHP utilisera nos classes personnalisées pour gérer le stockage et la lecture des sessions.

 <span><span><span class="hljs-comment">// Hypothèses $dbConnection C&#39;est efficace PDO Objet de connexion de la base de données</span></span><span>
</span><span><span class="hljs-variable">$handler</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DatabaseSessionHandler</span></span><span>(</span><span><span class="hljs-variable">$dbConnection</span></span><span>);

</span><span><span class="hljs-comment">// Enregistrez un processeur de session personnalisé</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_set_save_handler</span></span><span>(
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'open'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'close'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'read'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'write'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'destroy'</span></span><span>],
    [</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'gc'</span></span><span>]
);

</span><span><span class="hljs-comment">// Démarrer une session</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span></span>

Étape 3: Démarrez la session et utilisez

Désormais, les données de session PHP sont stockées dans la base de données au lieu du système de fichiers par défaut. Vous pouvez utiliser la variable $ _Session comme d'habitude pour accéder aux données de session:

 <span><span><span class="hljs-comment">// Définir les données de session</span></span><span>
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user'</span></span><span>] = </span><span><span class="hljs-string">'John Doe'</span></span><span>;

</span><span><span class="hljs-comment">// Obtenir les données de session</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user'</span></span><span>];  </span><span><span class="hljs-comment">// Sortir John Doe</span></span><span>
</span></span>

3. Résumé

En implémentant les interfaces SessionIdInterface et SessionHandlerInterface , les développeurs peuvent personnaliser de manière flexible le mécanisme de stockage de session de PHP et ne plus compter sur le système de fichiers ou la méthode de stockage par défaut de PHP. Que ce soit stocké dans une base de données ou un système de cache, la gestion de la session Metro peut être plus efficace et flexible. Dans le même temps, cela améliore également l'évolutivité du système et peut s'adapter à différents scénarios d'application.

En personnalisant la méthode de stockage de session, vous pouvez non seulement contrôler l'emplacement du stockage des données de session, mais également fournir un contrôle plus granulaire sur la génération, le stockage et la lecture des identifiants de session, répondant ainsi aux besoins commerciaux plus complexes.