"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
"
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é ?
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.
Vous devez d'abord implémenter les cas suivants et introduire la classe cache
Comment fonctionne le cache ?
Juste le codeCache::set
Savez-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.
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.
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.
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.
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.
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
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
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.
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)
Ici, nous l'imprimons une fois. $options
Cette valeur.
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.
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.
Quand vous arrivez à la méthode make, regardez simplement l'endroit encerclé
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.
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.
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.
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
. $this->handler = $this->connect($options);
avec $options
md5 comme indice. $instance
Le code final sera retourné à la méthode __call dans le cache, la classe est object(thinkcachedriverFile)
La méthode est set
Ensuite, le processus d'exécution arrivera à l'emplacement indiqué ci-dessous et écrira 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.
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é.
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
Ensuite, venez au constructeur et vous pouvez voir les paramètres du chemin
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.
À ce moment, vous pouvez vérifier le fichier créé et vous pouvez voir que le fichier a été créé.
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
Le formulaire de stockage de la base de données est comme indiqué ci-dessous
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.
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
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
Lorsque la classe façade crée la classe cache, elle viendra dans le fichier de classe cachethinkphp/library/think/Cache.php
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.php
méthode get de cette classe
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.
Utilisez ensuite file_get_contents pour obtenir 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.
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 ?
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.
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!