Maison  >  Article  >  cadre php  >  Analyse approfondie du code source du cache ThinkPHP

Analyse approfondie du code source du cache ThinkPHP

咔咔
咔咔original
2021-01-18 22:46:261859parcourir
"

Le cache est une fonction qui sera utilisée une fois le projet exécuté pendant un certain temps. Cet article fera une analyse approfondie du cache dans le framework

"

Avant-propos

La mise en cache est une fonction essentielle du projet , lorsque le volume utilisateur Lorsqu'il est important, il doit être mis en cache. Si vous vérifiez directement la base de données, ce sera dommage pour l'expérience utilisateur.

Alors, dans quelles circonstances le cache doit-il être utilisé ?

  • Événements chauds, tels que les recherches rapides sur Weibo
  • Données rarement mises à jour, telles que les éléments de configuration
  • Classement des plateformes de blogs
  • Liste de surveillance des plateformes sociales, liste de fans, etc.

Ces scénarios d'application mentionnés ci-dessus ne sont pas Il est dit que le cache du framework n'est généralement pas utilisé au niveau du cache.

Les plus couramment utilisés sont Redis, Memcache et autres NoSQL.

Mais aujourd'hui, nous discutons principalement de la mise en cache dans le framework, alors ne pensez pas que la mise en cache du framework est omnipotente, cela dépend toujours de la situation réelle du projet.

1. Processus d'exécution des paramètres de cache et d'analyse du code source

Vous devez d'abord implémenter les cas suivants et introduire la classe cache

Analyse approfondie du code source du cache ThinkPHP
Cas de démonstration

Comment fonctionne le cache ?

Juste le codeCache::setSavez-vous comment cela fonctionne maintenant ? Si vous ne connaissez pas Kaka, je vous emmènerai l'apprendre en profondeur.

Nous savons tous que le fichier d'entrée du framework est index.php, et un fichier appelé base.php est introduit dans le fichier d'entrée.

Analyse approfondie du code source du cache ThinkPHP
Fichier d'entrée

Allez dans le fichier base.php et vous pourrez voir comment enregistrer les alias de la bibliothèque de classes. Quant à la façon de s'inscrire, elle est exécutée dans. le cadre Il y a une explication détaillée dans la section sur le processus, vous pouvez revenir en arrière et en savoir plus.

Analyse approfondie du code source du cache ThinkPHP
Enregistrer l'alias de la bibliothèque de classes

Le code sera donc exécuté dans la classe façade au cœur du framework. Il y a une méthode __callStatic dans cette classe. . Cette méthode est exécutée lorsqu'une méthode statique inexistante est appelée.

Analyse approfondie du code source du cache ThinkPHP
Classe principale de façade

Alors comment faire cette vérification ! Vous ne pouvez pas simplement dire ça, c’est comme ça, n’est-ce pas ?

Ensuite, le code viendra à la méthode de création d'une instance Facade. Le test que nous faisons est d'imprimer la valeur de cette classe.

Analyse approfondie du code source du cache ThinkPHP
Créer une instance Facade

Quel que soit le nombre de fois que ce cache a été exécuté pour le moment, vous pouvez clairement voir que cette valeur existe dans le résultat de l'impression, donc d'un autre Les aspects maladroits ont vérifié la rhétorique de Kaka.

Analyse approfondie du code source du cache ThinkPHP
Valeur de test imprimée

Il y a un très petit détail ici que je pense que tout le monde devrait connaître, à propos de l'utilisation de l'électricité statique

Conseils sur le statique

Vous pouvez d'abord voir que la classe cache hérite de la classe Facade

Analyse approfondie du code source du cache ThinkPHP
l'héritage de classe

Ensuite, static est utilisé dans la classe façade, puis la classe finale renvoyée est la classe qui hérite de la classe façade, qui est la classe cache

Analyse approfondie du code source du cache ThinkPHP
Démonstration de la classe Façade

peut être résumé en une phrase comme

statique Si elle est héritée, la sous-classe sera appelée par défaut, sinon elle s'appellera

. Continuons donc ci-dessous. Le static::getFacadeClass() voici aussi la méthode de la sous-classe qui est exécutée.

Bon, entrons dans un petit intermède, puis nous passerons au sujet principal.

Le code sera donc exécuté dans le fichier thinkphp/library/think/Cache.php, qui est l'emplacement de la bibliothèque de classes principale.

Vous ne trouvez pas la méthode set dans cette méthode, donc le code sera exécuté vers la méthode __call, qui sera déclenchée lorsqu'une méthode inexistante est appelée.

Analyse approfondie du code source du cache ThinkPHP
Classe Cache

Initier automatiquement le cache

Selon le processus d'exécution nous verrons la méthode init Initialiser automatiquement le cache (il convient de noter ici que la première fois n'est pas exécutée ici, mais la méthode make. Lorsque la méthode make est exécutée, la valeur sera stockée dans l'attribut du gestionnaire. La deuxième fois, elle entre via l'appel méthode, il reviendra directement, au lieu de l'exécuter une fois, vous devez faire attention ici)

Analyse approfondie du code source du cache ThinkPHP
Initialiser automatiquement le cache

Ici, nous l'imprimons une fois. $optionsCette valeur.

Analyse approfondie du code source du cache ThinkPHP
Imprimer les résultats

Discutez de la raison pour laquelle le paramètre $options a une valeur

Il s'agit du conteneur connaissances, venez à Kaka pour vous les montrer.

Analyse approfondie du code source du cache ThinkPHP
Méthode make

Lors de la création d'un Cache, créez une instance Facade. Pendant ce processus, faites attention à la zone encerclée dans l'image ci-dessous et exécutez un This is. la méthode make.

Analyse approfondie du code source du cache ThinkPHP
Créer une instance de façade

Quand vous arrivez à la méthode make, regardez simplement l'endroit encerclé

Analyse approfondie du code source du cache ThinkPHP第二次执行的位置
La position où la méthode make est exécutée pour la deuxième fois

puis entre dans la méthode invokeClass Cette méthode appelle l'instanciation de la classe d'exécution de réflexion pour prendre en charge l'injection de dépendances.

Dans cette méthode, la méthode make dans le Cache est exécutée par réflexion.

调用反射执行类的实例化 支持依赖注入
Appelez l'instanciation de la classe d'exécution de réflexion pour prendre en charge l'injection de dépendances

Ainsi, la méthode make dans la classe Cache sera exécutée et cette méthode instanciera cette classe et exécutez le constructeur, jetons un coup d'œil ensuite.

缓存类的Analyse approfondie du code source du cache ThinkPHP
La méthode make de la classe cache

Lorsque vous arrivez au constructeur, vous verrez que les éléments de configuration du fichier de configuration du cache obtenu à partir de la méthode make sont passé dans la méthode init. C'est la partie qui initialise automatiquement le cache.

Analyse approfondie du code source du cache ThinkPHP
Constructeur

Donc à partir d'ici, vous pouvez voir que la méthode init initialise automatiquement le cache La première exécution est exécutée lorsque le conteneur est instancié, donc <.> Il y aura une valeur. $options

Ensuite, nous suivrons ce processus pour effectuer la mise en cache des connexions, qui est le contenu du code

. $this->handler = $this->connect($options);

Cette méthode est très simple. Elle utilise le modèle d'usine qui a été expliqué précédemment pour charger différents types de cache.

stockera ensuite l'objet renvoyé dans l'attribut d'instance de cache

avec $optionsmd5 comme indice. $instance

Analyse approfondie du code source du cache ThinkPHP
Cache de connexion

Le code final sera retourné à la méthode __call dans le cache, la classe est object(thinkcachedriverFile)La méthode est set

Analyse approfondie du code source du cache ThinkPHP
Lorsqu'une méthode qui n'existe pas est appelée, elle sera exécutée

Ensuite, le processus d'exécution arrivera à l'emplacement indiqué ci-dessous et écrira dans le cache

Analyse approfondie du code source du cache ThinkPHP
Écrire dans le cache

Obtenir le nom du fichier

La principale chose que vous devez comprendre dans cette méthode est de savoir comment pour obtenir le nom de fichier spécifique dans le cache, puis stocker les données de.

Cette valeur de nom est la valeur que nous devons définir, wechat.

Analyse approfondie du code source du cache ThinkPHP
Obtenir le nom du fichier de stockage de la variable

Ensuite, allez sur getCacheKey pour obtenir le nom du fichier de stockage de la variable.

La première étape de cette méthode consiste à chiffrer le type et la valeur du cache par hachage. Ces options sont déclarées dans cette classe et doivent être précisées ici.

Étant donné que la variable options est largement utilisée dans le framework, veillez à ne pas la confondre.

Ce que vous devez comprendre dans cette méthode, c'est comment le nom du fichier est déterminé.

Analyse approfondie du code source du cache ThinkPHP
Récupérer le nom du fichier

Il faut quand même aller au début de ce cours pour vérifier la valeur de cette option. Dans ce cours, vous pouvez. voir l'image ci-dessus. Le type de cryptage utilisé est hash_type qui est md5

Analyse approfondie du code source du cache ThinkPHP
À propos de la valeur mise en cache dans le fichier

Ensuite, venez au constructeur et vous pouvez voir les paramètres du chemin

Analyse approfondie du code source du cache ThinkPHP
Obtenir le chemin du fichier cache

Vous pouvez voir la Container::get('app') ligne de code dans l'image ci-dessus. du code est le conteneur exécuté et la méthode make , la méthode make joue un rôle très important dans le conteneur, elle doit donc être bien comprise.

Ensuite, il y a un petit détail que je ne sais pas si vous avez vu, c'est-à-dire qu'il y a une méthode init ci-dessous. Allons voir ce que fait cette méthode.

Après avoir adopté cette méthode, vous constaterez que le fichier est créé directement en fonction du chemin du fichier cache obtenu.

Analyse approfondie du code source du cache ThinkPHP
Vérification d'initialisation

À ce moment, vous pouvez vérifier le fichier créé et vous pouvez voir que le fichier a été créé.

Analyse approfondie du code source du cache ThinkPHP
Chemin du fichier cache

Enfin, utilisez la fonction file_put_contents pour stocker les données dans l'emplacement de stockage du fichier cache que vous venez d'obtenir

Analyse approfondie du code source du cache ThinkPHP
Écrire les données dans le fichier cache

Le formulaire de stockage de la base de données est comme indiqué ci-dessous

Analyse approfondie du code source du cache ThinkPHP
Formulaire de stockage des données

Jusqu'à ce que ce soit la fin des paramètres du cache du framework. En fait, le processus n'est pas difficile. Dans ce cas, le format de fichier utilisé par Kaka est le même que pour redis ou autres.

2. Processus d'exécution de l'acquisition du cache et de l'analyse du code source

Maintenant que vous avez appris le code source analyse des paramètres du cache, Ensuite, nous devrions également comprendre brièvement l'analyse du code source obtenue par le cache.

Le même cas de démonstration est le même qu'avant, remplacez simplement set par get

Analyse approfondie du code source du cache ThinkPHP
Cas de démonstration

Le processus de configuration du cache est le même. Tout d'abord, vous irez dans la classe façade pour créer l'instance correspondante du cache

Analyse approfondie du code source du cache ThinkPHPLa classe façade crée une instance de cache
Lorsque la classe façade crée la classe cache, elle viendra dans le fichier de classe cache

thinkphp/library/think/Cache.php

Vous pouvez le voir dans ce fichier Toujours en utilisant la méthode __call, cette méthode consiste à appeler une méthode qui n'existe pas et elle sera exécutée.

Analyse approfondie du code source du cache ThinkPHPFichiers mis en cache
Ensuite, vous arriverez à la méthode init, qui a été expliquée en profondeur lors de la définition de la valeur du cache.

Selon le processus d'exécution, nous verrons que la méthode init initialise automatiquement le cache (il faut noter ici que la première fois qu'elle est exécutée n'est pas ici, mais la méthode make. Lorsque la méthode make est exécutée, la valeur sera stockée dans l'attribut du gestionnaire, elle revient directement après avoir entré la méthode d'appel pour la deuxième fois sans l'exécuter à nouveau)

Pourquoi la méthode make du cache. exécuté en premier ? En effet, lors de la création d'une instance de classe cache dans un conteneur, la méthode make déterminera s'il existe une méthode make dans la classe. Si elle existe, elle sera exécutée en premier.

Analyse approfondie du code source du cache ThinkPHP
Initialiser automatiquement le cache

Donc dans la classe cache, le code return call_user_func_array([$this->init(), $method], $args); exécutera la thinkphp/library/think/cache/driver/File.phpméthode get de cette classe

Analyse approfondie du code source du cache ThinkPHP
Lire le cache

Dans cette classe, vous pouvez voir une méthode qui a pris beaucoup de temps à analyser lors de la définition de la valeur du cachegetCacheKey

Dans Dans cette méthode , sbustr est principalement utilisé pour chiffrer la strophe de la valeur. Les deux premières valeurs sont le répertoire et les caractères restants sont le nom du fichier.

Renvoyez ensuite le nom du fichier.

Analyse approfondie du code source du cache ThinkPHP
Obtenez le nom du fichier de stockage de la variable

Utilisez ensuite file_get_contents pour obtenir le contenu du fichier

Analyse approfondie du code source du cache ThinkPHP
Lisez le contenu du fichier

Ensuite, vous pouvez continuer à regarder en bas. Il y a ici un fichier de cache supprimé expiré.

La politique d'expiration du framework est que lorsque vous définissez le délai d'expiration, le cache ne sera pas supprimé directement après son expiration, mais sera supprimé après que vous y aurez à nouveau accédé.

Cette stratégie est la suppression paresseuse dans Redis. Lorsque nous utilisons la suppression paresseuse, les données ne seront pas automatiquement supprimées à leur expiration. Ensuite, sa méthode de suppression est que la prochaine fois que la valeur clé sera obtenue, elle fera un. jugement pour déterminer si la clé a expiré. Si elle a expiré, supprimez-la.

Analyse approfondie du code source du cache ThinkPHP
Fichiers de cache de sapin expirés

Jusqu'à présent, le processus d'exécution de l'acquisition du cache a été complété par l'analyse du code source. le contenu est obtenu lorsqu'il a été analysé.

Alors pourquoi parlons-nous encore d'obtenir des données mises en cache ? C'est parce que nous devons vous expliquer quelque chose ici ?

3. Compression des données

Lors de la configuration du cache, il y a eu un problème lors de l'écriture de la valeur mise en cache dans le fichier. Fonction gzcompress

Cependant, lors de l'obtention de la valeur du cache et de la lecture des données du fichier, une fonction gzuncompress

est en fait obtenue à partir des deux fonctions de définition du cache. et obtenir le cache. Il ressort de la fonction que les données compressées sont définies et que les données décompressées sont obtenues.

Il existe deux autres fonctions de compression en PHP : gzdeflate、gzencode, et la même fonction de décompression correspond également gzinflate gzdecode

Bien que ces fonctions soient toutes des fonctions de compression, l'implémentation sous-jacente n'est pas la même.

gzcompress utilise le format ZLIB ;

gzdeflate utilise le format DEFLATE pur ;

gzencode utilise le format GZIP

Ce qui précède concerne simplement certains ; connaissances sur la compression et la décompression des données.

4. Résumé

Dans cette section, Kaka vous présente les résultats du traitement de la mise en cache du framework.

En fait, Kaka a déjà testé que le temps de réponse du cache du framework devait être raccourci d'un tiers. Bien entendu, cela varie également en fonction de la quantité de données.

Cela termine l'interprétation du code source du framework PHP ThinkPHP Si j'ai le temps plus tard, j'interpréterai une partie du contenu non mentionné.

Enfin, lire le code source est vraiment fatiguant.

«

La persévérance dans l'apprentissage, la persévérance dans les blogs et la persévérance dans le partage sont les convictions auxquelles Kaka a toujours adhéré depuis qu'il a commencé à travailler dans l'industrie. J'espère que les articles de Kaka. dans Nuoda Internet peut vous apporter n'importe quelle aide. Je m'appelle Kaka, à la prochaine fois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn