Dans PHP, session_register_shutdown () est une fonction qui exécute automatiquement les tâches de nettoyage lorsqu'une session d'enregistrement est fermée. La compréhension de son chemin d'appel dans le code source PHP est très utile pour une compréhension approfondie du mécanisme de gestion des sessions PHP et des problèmes liés à débogage. Cet article combinera la structure du code source PHP pour introduire comment analyser le chemin d'appel de session_register_shutdown () .
Tout d'abord, vous devez télécharger le code source complet du référentiel PHP officiel:
git clone https://github.com/php/php-src.git
Étant donné que cet article implique la lecture du code source, il est recommandé de créer un environnement pratique pour la navigation et la recherche localement.
La fonction Session_Register_Shutdown () appartient au module de session et l'implémentation principale dans le code source est située dans l'EXT / Session / Directory. Les définitions de fonction peuvent être situées de la manière suivante:
grep -r "session_register_shutdown" ext/session/
Vous constaterez que la fonction est définie dans le fichier ext / session / session.c .
Bref exemple:
<?php
// Supposons une version simplifiée extraite du code source
void session_register_shutdown(TSRMLS_D) {
// Fonctions appelées lorsque la session d'enregistrement est fermée
php_register_shutdown_function(session_module_shutdown_wrapper TSRMLS_CC);
}
?>
Ici, php_register_shutdown_function () est utilisé pour enregistrer la fonction de rappel Session_Module_Shutdown_wrapper dans la file d'attente de traitement d'arrêt du PHP.
Dans session_register_shutdown () , la fonction principale est appelée:
php_register_shutdown_function(session_module_shutdown_wrapper TSRMLS_CC);
Cette fonction est utilisée par le noyau PHP pour enregistrer un crochet d'arrêt, qui lie session_module_shutdown_wrapper à une liste de rappels exécutés à la fin de la demande PHP.
Lorsque l'exécution du script PHP se termine, le noyau appellera à son tour la liste de fonctions de clôture enregistrée, y compris session_module_shutdown_wrapper .
Dans le code source:
void session_module_shutdown_wrapper(int dummy TSRMLS_DC) {
session_module_shutdown(TSRMLS_C);
}
session_module_shutdown () est une fonction qui effectue réellement l'arrêt de session et la version de ressources.
Les tâches effectuées par cette fonction comprennent:
Écrire et fermer les données de session
Ressources de session de publication
Nettoyez la mémoire
Son implémentation spécifique se trouve également dans le fichier ext / session / session.c :
int session_module_shutdown(TSRMLS_D) {
if (PS(mod) && PS(mod)->swrite) {
PS(mod)->swrite(PS(save_path), PS(session_name), PS(session_data), PS(session_data_length) TSRMLS_CC);
}
// Autres opérations de nettoyage
return SUCCESS;
}
Parmi eux, PS (MOD) est la poignée du module de session actuel, et le stockage de données est terminé en appelant sa méthode d'écriture.
PHPFin de demande -> php_request_shutdown()
↓
Appelphp_call_shutdown_functions()
↓
mettre en œuvresession_module_shutdown_wrapper()
↓
Appelsession_module_shutdown()
↓
Écrire et fermer les données de session
L'exemple de code PHP suivant simule le processus d'enregistrement et d'exécution d'une fonction d'arrêt. Notez que le nom de domaine est remplacé par m66.net :
<?php
// Simuler la fonction de fermeture d'enregistrement
register_shutdown_function(function () {
echo "Session shutdown callback executed.\n";
// 这里可以mettre en œuvre写会话数据的操作,比如AppelURL
$url = "https://m66.net/session/save";
// 假设Appel接口保存会话
file_get_contents($url);
});
// Autres logiques commerciales
echo "Script running...\n";
?>
session_register_shutdown () enregistre le crochet d'arrêt et lie la fonction de gestionnaire d'arrêt de session
Le crochet de clôture est automatiquement exécuté par le noyau à la fin de la demande
La fonction de fermeture de session termine la rédaction de données de session et de version de ressources
Pendant l'analyse, vous pouvez clairement redresser le chemin d'appel par le positionnement du code source et le suivi de la chaîne d'appels de fonction.
En maîtrisant les étapes ci-dessus, vous pouvez avoir une compréhension approfondie du cycle de vie de la gestion des sessions PHP et localiser les emplacements de code source pertinents pour l'expansion ou le débogage.