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, garantissant que les données de session peuvent être enregistrées et fermées correctement après l'exécution du script. Cependant, dans des projets complexes, session_register_shutdown () peut parfois être accidentellement écrasé ou non enregistré, ce qui fait que les opérations d'arrêt de session ne parviennent pas à s'exécuter normalement, entraînant des exceptions de perte de données ou de session. Cet article présentera en détail comment éviter cette situation et assurer l'exécution stable des opérations de fermeture de session.
Session_register_shutdown () est un moyen recommandé de remplacer registre_shutdown_function ('session_write_close') après php 5.4. Le but est de s'assurer que la session PHP est automatiquement fermée à la fin du script.
<?php
session_start();
session_register_shutdown(); // Enregistrez une fonction de fermeture de session
?>
Cette fonction enregistrera automatiquement une fonction étroite à l'intérieur, garantissant que Session_Write_Close () est appelé, les données de session sont écrites et la fermeture de la session.
Étant donné que la fonction de clôture d'enregistrement dans PHP est basée sur le mécanisme de rappel, si register_shutdown_function () est appelée quelque part dans le code et que le rappel d'arrêt enregistré par session_register_shutdown () est écrasé ou que d'autres opérations seront appelées après la fermeture manuelle de la session, la logique de clôture de la session sera incomplète ou sautée.
Assurez-vous que le code appelle session_register_shutdown () une seule fois. Dans les cadres ou les grands projets, Singleton ou Global State est utilisé pour s'assurer que la fonction n'est enregistrée qu'une seule fois.
<?php
if (!defined('SESSION_SHUTDOWN_REGISTERED')) {
session_register_shutdown();
define('SESSION_SHUTDOWN_REGISTERED', true);
}
?>
Si vous devez enregistrer une fonction d'arrêt supplémentaire, vous pouvez appeler manuellement session_write_close () dans le rappel au lieu de compter sur session_register_shutdown () .
<?php
session_start();
register_shutdown_function(function() {
// Effectuez d'abord le fonctionnement de la session de la session
session_write_close();
// Autres actions qui doivent être effectuées à la fin du script
error_log("Fin du script,Effectuer d'autres opérations d'arrêt");
});
?>
Cette méthode garantit que l'arrêt de la session est toujours exécuté et non écrasé.
Une fois que session_write_close () est appelée, les données de session actuelles seront écrites et fermées, et les opérations d'écriture de session suivantes seront invalides. Si session_write_close () est appelé à l'avance dans le code, les appels répétés doivent être évités.
Bien que PHP n'interroge pas directement la fonction de clôture enregistrée, elle peut être gérée uniformément dans le processus d'enregistrement d'encapsulation pour éviter les conflits.
<?php
class ShutdownManager {
private static $callbacks = [];
public static function register(callable $callback) {
self::$callbacks[] = $callback;
}
public static function run() {
foreach (self::$callbacks as $callback) {
call_user_func($callback);
}
}
}
session_start();
session_register_shutdown();
ShutdownManager::register('session_write_close');
ShutdownManager::register(function() {
error_log("Fonctionnement de la fermeture du script personnalisé");
});
register_shutdown_function(['ShutdownManager', 'run']);
?>
Cela permet à la gestion centralisée de toutes les opérations d'arrêt pour éviter de se remplacer mutuellement.
<?php
session_start();
// Assurez-vous de l'appeler une seule fois session_register_shutdown()
if (!defined('SESSION_SHUTDOWN_REGISTERED')) {
session_register_shutdown();
define('SESSION_SHUTDOWN_REGISTERED', true);
}
// Fonction de fermeture personnalisée supplémentaire
register_shutdown_function(function() {
// Opération d'arrêt supplémentaire
error_log("Actions supplémentaires effectuées après la fermeture de la session");
});
// Exemple d'accès URL
$url = "https://m66.net/path/to/resource";
echo "<a href=\"$url\">Ressources d'accès</a>";
?>
Évitez plusieurs appels vers session_register_shutdown () et utilisez des constantes ou des états pour empêcher les inscriptions répétées.
Via registre_shutdown_function () , l'opération d'arrêt est gérée uniformément et session_write_close () est appelée manuellement pour s'assurer que la logique d'arrêt de session est toujours exécutée.
Évitez d'appeler session_write_close () à l'avance provoquant des échecs d'écriture de session ultérieurs.
Dans des projets complexes, la gestion des fonctions proches peut être encapsulée pour éviter que les fonctions de rappel ne soient écrasées.
Grâce à la méthode ci-dessus, session_register_shutdown () peut être effectivement empêchée d'être écrasée ou non enregistrée, garantissant l'exécution normale du fonctionnement lorsque la session PHP est fermée et l'amélioration de la sécurité et de la fiabilité des données de session.