Heim >PHP-Framework >Denken Sie an PHP >Eingehende Analyse des ThinkPHP-Cache-Quellcodes

Eingehende Analyse des ThinkPHP-Cache-Quellcodes

咔咔
咔咔Original
2021-01-18 22:46:261900Durchsuche
"

Cache ist eine Funktion, die verwendet wird, nachdem das Projekt über einen bestimmten Zeitraum ausgeführt wurde. In diesem Artikel wird eine detaillierte Analyse des Caches im Framework durchgeführt

"

Vorwort

Im Projekt ist der Cache eine unverzichtbare Funktion. Wenn die Anzahl der Benutzer groß ist, ist das Caching erforderlich. Wenn Sie die Datenbank direkt überprüfen, ist dies zu schlecht für die Benutzererfahrung.

Unter welchen Umständen sollten Sie also Caching verwenden?

  • Heiße Ereignisse, wie z. B. Weibo-Hot-Suchen
  • Selten aktualisierte Daten, wie z. B. Konfigurationselemente
  • Blog-Plattform-Rangliste
  • Beobachtungsliste für soziale Plattformen, Fanliste usw.

The Die oben genannten Anwendungsszenarien beziehen sich nicht auf den Cache des Frameworks. Im Allgemeinen wird der Cache des Frameworks nicht auf Cache-Ebene verwendet.

Häufig verwendet werden Redis, Memcache und anderes NoSQL.

Aber die heutige Hauptdiskussion ist das Caching im Framework. Denken Sie also nicht, dass das Caching des Frameworks allmächtig ist, es hängt immer noch von der tatsächlichen Situation des Projekts ab.

1. Ausführungsprozess der Cache-Einstellungen und Quellcode-Analyse

Zuerst müssen Sie den folgenden Fall implementieren und die Cache-Klasse einführen

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Demo-Fall

Wie läuft der Cache ab?

Nur der CodeCache::setWissen Sie, wie das jetzt funktioniert? Wenn Sie Kaka nicht kennen, bringe ich Sie dazu, es eingehend zu lernen.

Wir alle wissen, dass die Eintragsdatei des Frameworks index.php ist und eine Datei namens base.php in die Eintragsdatei eingeführt wird.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Eintragsdatei

Gehen Sie zur Datei base.php und erfahren Sie, wie Sie sich im Abschnitt zum Framework-Ausführungsprozess registrieren zurück zu Machen Sie weiter und erfahren Sie mehr.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Alias ​​der Klassenbibliothek registrieren

Der Code wird also in der Fassadenklasse im Kern des Frameworks ausgeführt. In dieser Klasse gibt es eine Methode __callStatic. Diese Methode wird ausgeführt, wenn eine nicht vorhandene statische Methode vorhanden ist angerufen.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Die Kernklasse der Fassade

Wie führt man diese Überprüfung durch? Das kann man doch nicht einfach so sagen, das ist doch so, oder?

Dann kommt der Code zur Methode zum Erstellen einer Facade-Instanz. Der Test, den wir durchführen, besteht darin, den Wert dieser Klasse auszudrucken.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Fassadeninstanz erstellen

Unabhängig davon, wie oft dieser Cache ausgeführt wurde, können Sie deutlich erkennen, dass dieser Wert im Druckergebnis vorhanden ist. Dies ist also eine weitere ungeschickte Möglichkeit, Kakas Aussage zu überprüfen.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Gedruckter Testwert

Hier gibt es ein sehr kleines Detail, das meiner Meinung nach jeder kennen sollte, nämlich die Verwendung von Statik.

Tipps zu Statik Erben Sie diese Fassaden-Fassadenklasse

Vererbung der Klasse
Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Dann wird statisch in der Fassadenklasse verwendet, und die letzte zurückgegebene Klasse ist die Klasse, die die Fassadenklasse erbt, also die Cache-Klasse

Fassadenklasse Demonstration
Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Es kann in einem Satz zusammengefasst werden als

statisch Wenn es vererbt wird, wird die Unterklasse standardmäßig aufgerufen, andernfalls ruft sie sich selbst auf

Das Folgende hier ist auch die Methode in der ausgeführte Unterklasse.

Okay, lasst uns eine kleine Pause einlegen, dann kommen wir zum Hauptthema.

Der Code wird also so ausgeführt: thinkphp/library/ think/Cache.phpDiese Datei ist der Speicherort der Kernklassenbibliothek. thinkphp/library/think/Cache.php这个文件,也就是核心类库的位置。

在这个方法你是找不到set方法的,所以代码将会执行到__call方法,这个方法当调用不存在的方法时则会触发的方法。

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Eingehende Analyse des ThinkPHP-Cache-Quellcodes

Eingehende Analyse des ThinkPHP-Cache-Quellcodes

根据执行流程我们将会看到init这个方法Eingehende Analyse des ThinkPHP-Cache-Quellcodes(这里需要注意,第一次并不是在这里进行执行的,而是Eingehende Analyse des ThinkPHP-Cache-Quellcodes,当Eingehende Analyse des ThinkPHP-Cache-Quellcodes执行完后会把值存放在handler这个属性,第二次通过call方法进来之后就直接返回了,而不会在进行一次执行,这里一定要注意)

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Eingehende Analyse des ThinkPHP-Cache-Quellcodes

在这里我们进行打印一次$options

Sie können die Set-Methode in dieser Methode nicht finden, daher wird der Code in der __call-Methode ausgeführt, die ausgelöst wird, wenn eine nicht vorhandene Methode aufgerufen wird.
Eingehende Analyse des ThinkPHP-Cache-Quellcodes
cached class

Automatisch initialisierter Cache

Entsprechend dem Ausführungsprozess werden wir sehen, dass die Init-Methode den Cache automatisch initialisiert (hier ist zu beachten, dass die erste Ausführung nicht hier ist, sondern die Make-Methode. Wenn die Make-Methode ausgeführt wird, wird die Der Wert wird in gespeichert. Das Handler-Attribut wird direkt nach der zweiten Eingabe über die Aufrufmethode zurückgegeben und nicht erneut ausgeführt (Sie müssen hier aufpassen)

🎜Automatischer Initialisierungscache$optionsDer Wert davon. 🎜🎜🎜🎜Drucken Sie die Ergebnisse aus🎜🎜🎜🎜Besprechen Sie, warum der Parameter $options einen Wert hat🎜🎜🎜Hier finden Sie das Wissen über Container, kommen Sie zu Kaka, um es Ihnen zu zeigen. 🎜
Eingehende Analyse des ThinkPHP-Cache-Quellcodes
make-Methode

Wenn Sie beim Erstellen eines Caches eine Facade-Instanz erstellen, achten Sie während dieses Vorgangs auf den eingekreisten Bereich im Bild unten und führen Sie eine make-Methode aus, die 800 Mal gesehen wurde.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Erstellen Sie eine Fassadeninstanz

Wenn Sie zur Make-Methode kommen, schauen Sie sich einfach die eingekreiste Stelle an

Eingehende Analyse des ThinkPHP-Cache-Quellcodes第二次执行的位置
Die Stelle, an der die Make-Methode zum zweiten Mal ausgeführt wird

Dann geben Sie die invokeClass-Methode ein, Diese Methode ruft die Instanziierung einer Reflexionsausführungsklasse auf und unterstützt die Abhängigkeitsinjektion.

Bei dieser Methode wird die Make-Methode im Cache durch Reflektion ausgeführt.

调用反射执行类的实例化 支持依赖注入
Rufen Sie die Instanziierung der Reflection-Ausführungsklasse auf und unterstützen Sie die Abhängigkeitsinjektion.

Damit die Make-Methode in der Cache-Klasse ausgeführt wird, wird diese Methode instanziiert und der Konstruktor ausgeführt.

缓存类的Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Die Make-Methode der Cache-Klasse

Gehen Sie zum Konstruktor und Sie werden sehen, dass die von der Make-Methode erhaltenen Konfigurationselemente der Cache-Konfigurationsdatei an die Init-Methode übergeben werden, die den Teil automatisch initialisiert Cache.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Konstruktor

Von hier aus können Sie sehen, dass die Init-Methode den Cache automatisch initialisiert. Die erste Ausführung wird ausgeführt, wenn der Container instanziiert wird, also $options wird einen Wert haben. $options才会存在值。

接下来将顺着这个流程进行Eingehende Analyse des ThinkPHP-Cache-Quellcodes也就是代码$this->handler = $this->connect($options);这块的内容。

这个方法就很简单了,就是使用了之前一直讲解的工厂模式实现的加载不同类型的缓存方式。

然后会把返回的对象存放在以$optionsmd5为下标的缓存实例属性$instance

Als nächstes folgen wir diesem Prozess, um Verbindungscaching durchzuführen. Dies ist der Code $this->handler = $this->connect($options);Der Inhalt dieses Blocks. 🎜🎜Diese Methode ist sehr einfach. Sie verwendet das zuvor erläuterte Factory-Muster, um verschiedene Cache-Typen zu laden. 🎜🎜Dann wird das zurückgegebene Objekt in $options md5 ist das tiefgestellte Cache-Instanzattribut<code style="font-size: 14px; Zeilenumbruch: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba (27,31,35,.05); Schriftfamilie: Operator Mono, Consolas, Menlo, monospace: break-all;">$instance Innen. 🎜<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img-blog.csdnimg.cn/20201120232141758.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmdrYW5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="Eingehende Analyse des ThinkPHP-Cache-Quellcodes" style="max-width:90%"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">Mit dem Cache verbinden</figcaption></figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Der endgültige Code wird an die __call-Methode im Cache zurückgegeben, die Klasse ist <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">object(thinkcachedriverFile)方法为set

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Wenn eine nicht vorhandene Methode aufgerufen wird, wird sie ausgeführt

Dann wird die Der Ausführungsprozess kommt an den unten stehenden Ort und schreibt Cache

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Cache schreiben

Dateinamen abrufen

Eines der wichtigsten Dinge, die Sie bei dieser Methode verstehen müssen, ist, wie Sie den spezifischen Dateinamen abrufen und dann speichern die Daten im Cache.

Dieser Namenswert ist der Wert, den wir festlegen müssen, wechat.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Rufen Sie den Speicherdateinamen der Variablen ab

Gehen Sie dann zu getCacheKey, um den Speicherdateinamen der Variablen abzurufen.

Der erste Schritt bei dieser Methode besteht darin, den Typ und den Cache-Wert durch Hashing zu verschlüsseln. Diese Optionen werden in dieser Klasse deklariert und müssen hier klar sein.

Da die Optionsvariable im Framework häufig verwendet wird, sollten Sie sie nicht verwechseln.

Was Sie bei dieser Methode verstehen müssen, ist, wie der Dateiname ermittelt wird.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Um den Dateinamen zu erhalten

Sie müssen noch zum Anfang dieser Klasse gehen, um den Wert dieser Optionen zu überprüfen. In dieser Klasse können Sie sehen, dass der im Bild oben verwendete Verschlüsselungstyp hash_type ist md5

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Informationen zum Zwischenspeichern des Dateiwerts

Dann gehen Sie zum Konstruktor und Sie können die Pfadeinstellung sehen

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Den Pfad der zwischengespeicherten Datei abrufen

Sie können diese Zeile sehen Im obigen Bild wird diese Codezeile verwendet. Der Container führt auch die Make-Methode aus. Diese Make-Methode spielt im Container eine sehr wichtige Rolle und muss daher gut verstanden werden. Container::get('app')

Dann gibt es ein kleines Detail, von dem ich nicht weiß, ob Sie es gesehen haben, nämlich, dass es unten eine Init-Methode gibt. Sehen wir uns an, was diese Methode bewirkt.

Nachdem Sie zu dieser Methode gekommen sind, werden Sie feststellen, dass die Datei direkt entsprechend dem Pfad der erhaltenen Cache-Datei erstellt wird.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Initialisierungsprüfung

Sie können zu diesem Zeitpunkt die erstellte Datei überprüfen und sehen, dass die Datei erstellt wurde.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Der Pfad der Cache-Datei

Abschließend verwenden Sie die Funktion file_put_contents, um die Daten am gerade erhaltenen Speicherort der Cache-Datei zu speichern

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Schreiben Sie die Daten in die Cache-Datei

Das Datenbankspeicherformular ist Wie unten gezeigt

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Datenspeicherungsformular

Bis zu diesem Punkt sind die Framework-Cache-Einstellungen abgeschlossen. In diesem Fall ist das von Kaka verwendete Dateiformat das gleiche wie für Redis oder andere.

2. Ausführungsprozess und Quellcode-Analyse der Cache-Cache-Erfassung

Nachdem Sie nun die Quellcode-Analyse der Cache-Einstellungen gelernt haben, sollten Sie auch kurz die Quellcode-Analyse der Cache-Erfassung verstehen.

Derselbe Demonstrationsfall ist derselbe wie zuvor, nur set durch get ersetzen

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Demo-Fall

Der Vorgang zum Einrichten des Caches ist derselbe. Zuerst gelangen Sie zur Fassadenklasse, um die entsprechende Instanz des Caches zu erstellen

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Die Fassadenklasse erstellt die Cache-Instanz

Nachdem die Fassadenklasse die Cache-Klasse erstellt hat, gelangen Sie zur Cache-Klassendateithinkphp/library/think/Cache.php

In dieser Datei können Sie sehen, dass die __call-Methode weiterhin verwendet wird. Diese Methode dient zum Aufrufen einer nicht vorhandenen Methode und wird ausgeführt.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Zwischengespeicherte Dateien

Dann gelangen Sie zur Init-Methode. Diese Methode wurde beim Festlegen des Cache-Werts ausführlich erläutert.

Je nach Ausführungsprozess werden wir sehen, dass die Init-Methode den Cache automatisch initialisiert (hier ist zu beachten, dass die erste Ausführung nicht hier ist, sondern die Make-Methode. Wenn die Make-Methode ausgeführt wird, wird der Wert angezeigt wird im Handler-Attribut gespeichert, nachdem es zum zweiten Mal über die Aufrufmethode eingegangen ist, kehrt es direkt zurück, ohne es erneut auszuführen. (Sie müssen hier darauf achten.)

Warum die Make-Methode des Caches hier zuerst ausgeführt wird, liegt am Cache Klasseninstanz wird im Container erstellt. Zu diesem Zeitpunkt wird in der Make-Methode beurteilt, ob in der Klasse eine Make-Methode vorhanden ist, und wenn vorhanden, wird sie zuerst ausgeführt.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Cache automatisch initialisieren

Also in der Cache-Klassethinkphp/library/think/cache/driver/File.phpDie get-Methode dieser Klassereturn call_user_func_array([$this->init(), $method], $args);这块代码会去执行thinkphp/library/think/cache/driver/File.php这个类的get方法

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Eingehende Analyse des ThinkPHP-Cache-Quellcodes

在这个类中你可以看到一个在设置缓存值时花了好久解析的一个方法getCacheKey

Cache lesen

Read Cache

Zeit zum Parsen beim Festlegen des Cache-Werts ,31,35,.05); Schriftfamilie: Operator Mono, Consolas, Monaco, Monospace; Farbe: rgb(271, 93, 108);">getCacheKey
Eingehende Analyse des ThinkPHP-Cache-QuellcodesBei dieser Methode wird sbustr hauptsächlich zum Verschlüsseln der Wertestrophe verwendet. Die ersten beiden Werte sind Verzeichnisse und die restlichen Zeichen sind Dateinamen.
Dann geben Sie den Dateinamen zurück.

🎜Rufen Sie den Speicherdateinamen der Variablen ab🎜🎜🎜Dann verwenden Sie file_get_contents, um den Inhalt der Datei abzurufen🎜
Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Lesen Sie den Dateiinhalt

Dann können Sie weiter nach unten schauen. Hier befindet sich eine abgelaufene gelöschte Cache-Datei.

Die Ablaufrichtlinie im Framework sieht vor, dass der Cache beim Festlegen der Ablaufzeit nicht direkt nach Ablauf gelöscht wird, sondern nach erneutem Zugriff gelöscht wird.

Diese Strategie ist das verzögerte Löschen. Wenn wir das verzögerte Löschen verwenden, werden die Daten nicht automatisch gelöscht, wenn der Schlüsselwert das nächste Mal abgerufen wird abgelaufen. Wenn es abgelaufen ist, löschen Sie es.

Eingehende Analyse des ThinkPHP-Cache-Quellcodes
Abgelaufene Tannenbaum-Cache-Dateien

Bisher wurde der Ausführungsprozess der Cache-Erfassung durch Quellcode-Analyse abgeschlossen. Tatsächlich wurde der größte Teil des Inhalts beim Abrufen analysiert.

Warum reden wir dann immer noch über das Abrufen zwischengespeicherter Daten? Das liegt daran, dass wir Ihnen hier etwas erklären müssen.

3. Datenkomprimierung

Beim Einrichten des Caches gibt es eine Funktion, um den zwischengespeicherten Wert in die Datei gzcompressgzcompress

然而在获取缓存值的时候从文件将数据读出时又遇到的一个函数gzuncompress

Beim Abrufen des Cache-Werts wird jedoch beim Lesen von Daten aus der Dateigzuncompress

In der Tat, vom Setzen des Caches bis zum Abrufen des Caches Aus der Funktion ist ersichtlich, dass die komprimierten Daten festgelegt und die dekomprimierten Daten erhalten werden. 🎜

Es gibt zwei weitere Komprimierungsfunktionen in PHP: gzdeflate、gzencode,同样的解压函数也是对应的gzinflate gzdecode

Obwohl diese Funktionen alle Komprimierungsfunktionen sind, sind die zugrunde liegenden Implementierungen unterschiedlich.

gzcompress verwendet das ZLIB-Format;

gzdeflate verwendet das GZIP-Format;

Das Obige enthält einige Kenntnisse über Datenkomprimierung und -dekomprimierung.

In diesem Abschnitt führt Sie Kaka durch die Verarbeitungsergebnisse des Cachings durch das Framework.

Tatsächlich hat Kaka zuvor getestet, dass die Cache-Antwortzeit des Frameworks um ein Drittel verkürzt werden sollte. Dies hängt natürlich auch von der Größe der Daten ab.

Dies ist das Ende der Quellcode-Interpretation des PHP-Frameworks

ThinkPHP Wenn ich später Zeit habe, werde ich einige der nicht erwähnten Inhalte interpretieren. Schließlich ist das Lesen des Quellcodes wirklich anstrengend.

Beharrlichkeit beim Lernen, Beharrlichkeit beim Bloggen und Beharrlichkeit beim Teilen sind die Überzeugungen, die Kaka seit seiner Karriere immer vertreten hat. Ich hoffe, dass Kakas Artikel in Nuoda Internet Ihnen ein wenig helfen können , nächste Ausgabe Siehe.

Das obige ist der detaillierte Inhalt vonEingehende Analyse des ThinkPHP-Cache-Quellcodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn