Position actuelle: Accueil> Derniers articles> Comment résoudre le problème que la session ne peut pas être enregistrée automatiquement lorsque vous utilisez la fonction Session_Register_Shutdown ()?

Comment résoudre le problème que la session ne peut pas être enregistrée automatiquement lorsque vous utilisez la fonction Session_Register_Shutdown ()?

M66 2025-07-18

Dans PHP, la fonction session_register_shutdown () est utilisée pour enregistrer une fonction de rappel qui est automatiquement exécutée lorsque la session est fermée. En théorie, il peut nous aider à enregistrer automatiquement les données de session lorsque le script est exécuté. Cependant, dans une utilisation réelle, de nombreux développeurs ont rencontré un problème: même si Session_Register_Shutdown () est appelé, les données de session ne peuvent toujours pas être enregistrées automatiquement, ce qui entraîne la perte des informations de session ou la mise à jour en temps opportun.

Cet article analysera en détail les causes profondes de ce problème et fournira plusieurs solutions réalisables pour vous aider à gérer correctement la sauvegarde automatique des séances.


1. Analyse de la cause du problème

Session_register_shutdown () est en fait une fonction de niveau relativement bas. Il appellera automatiquement session_write_close () lorsque PHP ferme la session pour enregistrer les données de session. Cependant, à partir de PHP 5.4, cette fonction a été marquée comme rejetée et fonctionne instable dans certains environnements, en particulier lorsqu'il y a des appels précoces vers session_write_close () ou des opérations liées au tampon de sortie dans le script, session_register_shutdown () ne peut pas déclencher l'action de sauvegarde normalement.

De plus, session_register_shutdown () appelle automatiquement session_write_close () lorsque la session est fermée. Si le développeur a activement appelé session_write_close () dans le code, l'effet des appels suivants sera ignoré, ce qui entraînera une session correctement.


2. Solution

Solution 1: Évitez d'utiliser session_register_shutdown ()

Étant donné que session_register_shutdown () a été obsolète, il est recommandé d'utiliser Register_Shutdown_Function () directement combiné avec session_write_close () pour s'assurer que la session est appelée manuellement pour enregistrer à la fin du script.

Exemple de code:

 <?php
session_start();

// Enregistrer manuellement à la fin du script session
register_shutdown_function(function() {
    session_write_close();
});

// Réviser session données
$_SESSION['user'] = 'Zhang San';

echo "Session Ensemble";
?>

La clé ici consiste à utiliser registre_shutdown_function () , qui appellera les fonctions anonymes après l'exécution du script, garantissant ainsi que Session_write_close () est appelé et garantissant que les données de session sont enregistrées correctement.


Solution 2: Assurez-vous que Session_write_close () n'est pas appelé à l'avance dans le script

Si session_write_close () a été appelé dans d'autres parties du script, l'appel à register_shutdown_function () ou session_register_shutdown () peut être invalide. Le code doit être vérifié pour éviter les appels répétés.

Par exemple, le code suivant entraînera la fin de l'enregistrement de la session:

 <?php
session_start();

session_write_close(); // Fermé tôt session

// Appelé lorsque l&#39;inscription est fermée,En fait, il ne reviendra pas en vigueur
session_register_shutdown();

$_SESSION['user'] = 'Li si';

echo "Session Probablement pas sauvé";
?>

La méthode correcte consiste à supprimer la session_write_close () qui est fermée à l'avance:

 <?php
session_start();

session_register_shutdown();

$_SESSION['user'] = 'Li si';

echo "Session Sauvé";
?>

Cependant, il est recommandé de passer à la méthode d'écriture de la solution un pour éviter d'utiliser des fonctions jetées.


Schéma 3: Appelez manuellement session_write_close () au lieu de l'enregistrement automatique

Dans de nombreux scénarios, appeler session_write_close () directement avant la fin du code est également une approche stable et simple:

 <?php
session_start();

$_SESSION['cart'][] = 'marchandisesA';

// Après avoir traité toute logique commerciale,Écriture manuelle session
session_write_close();

echo "CART DE COMME";
?>

Cette méthode est plus compatible et évite la complexité de s'appuyer sur l'enregistrement automatique.


3. Ressources connexes

Pour plus d'informations sur le traitement des sessions PHP, veuillez vous référer à la documentation officielle:

 <a href="https://m66.net/manual/zh/function.register-shutdown-function.php">PHP officiel register_shutdown_function() document</a>