Heim >PHP-Framework >Denken Sie an PHP >Eingehende Analyse des ThinkPHP-Cache-Quellcodes
"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
"
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?
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.
Zuerst müssen Sie den folgenden Fall implementieren und die Cache-Klasse einführen
Wie läuft der Cache ab?
Nur der CodeCache::set
Wissen 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.
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.
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.
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.
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.
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 KlasseFassadenklasse Demonstrationstatisch 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.php
Diese Datei ist der Speicherort der Kernklassenbibliothek. thinkphp/library/think/Cache.php
这个文件,也就是核心类库的位置。
在这个方法你是找不到set方法的,所以代码将会执行到__call方法,这个方法当调用不存在的方法时则会触发的方法。
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方法进来之后就直接返回了,而不会在进行一次执行,这里一定要注意)
在这里我们进行打印一次$options
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)
🎜$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. 🎜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.
Wenn Sie zur Make-Methode kommen, schauen Sie sich einfach die eingekreiste Stelle an
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.
Damit die Make-Methode in der Cache-Klasse ausgeführt wird, wird diese Methode instanziiert und der Konstruktor ausgeführt.
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.
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);
这块的内容。
这个方法就很简单了,就是使用了之前一直讲解的工厂模式实现的加载不同类型的缓存方式。
然后会把返回的对象存放在以$options
md5为下标的缓存实例属性$instance
$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
Dann wird die Der Ausführungsprozess kommt an den unten stehenden Ort und schreibt Cache
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.
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.
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
Dann gehen Sie zum Konstruktor und Sie können die Pfadeinstellung sehen
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')
Sie können zu diesem Zeitpunkt die erstellte Datei überprüfen und sehen, dass die Datei erstellt wurde.
Abschließend verwenden Sie die Funktion file_put_contents, um die Daten am gerade erhaltenen Speicherort der Cache-Datei zu speichern
Das Datenbankspeicherformular ist Wie unten gezeigt
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.
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
Der Vorgang zum Einrichten des Caches ist derselbe. Zuerst gelangen Sie zur Fassadenklasse, um die entsprechende Instanz des Caches zu erstellen
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.
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.
Also in der Cache-Klassethinkphp/library/think/cache/driver/File.php
Die get-Methode dieser Klassereturn call_user_func_array([$this->init(), $method], $args);
这块代码会去执行thinkphp/library/think/cache/driver/File.php
这个类的get方法
在这个类中你可以看到一个在设置缓存值时花了好久解析的一个方法getCacheKey
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 🎜Rufen Sie den Speicherdateinamen der Variablen ab🎜🎜🎜Dann verwenden Sie file_get_contents, um den Inhalt der Datei abzurufen🎜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.
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.
Beim Einrichten des Caches gibt es eine Funktion, um den zwischengespeicherten Wert in die Datei gzcompress
gzcompress
然而在获取缓存值的时候从文件将数据读出时又遇到的一个函数gzuncompress
gzuncompress
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.
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!