Heim > php教程 > PHP开发 > Ausführliche Diskussion der Caching-Technologie – PHP

Ausführliche Diskussion der Caching-Technologie – PHP

黄舟
Freigeben: 2016-12-14 11:43:04
Original
1146 Leute haben es durchsucht

1. Einführung

PHP, eine Webdesign-Skriptsprache, die in den letzten Jahren aufgrund ihrer Leistungsfähigkeit und Skalierbarkeit große Fortschritte gemacht hat hat einen absoluten Geschwindigkeitsvorteil. Wenn Sie 60.000 Daten von MSSQL nach PHP übertragen möchten, dauert es 40 Sekunden, und ASP dauert nicht weniger als 2 Minuten. Da die Website jedoch immer mehr Daten enthält Ich bin bestrebt, die Daten schneller abzurufen, daher ist es nicht erforderlich, sie jedes Mal aus der Datenbank zu löschen, z. B. aus einer Datei oder einer bestimmten Speicheradresse. Dies ist die Caching-Technologie von PHP, die Cache-Technologie .

2. Eingehende Analyse

Im Allgemeinen besteht der Zweck des Cachings darin, Daten an einem Ort zu speichern, um den Zugriff zu beschleunigen, aber es ist möglich Es ist natürlich unrealistisch, dass Hunderte von M-Daten darin gespeichert werden. Wenn beispielsweise die Cache-Seite ob_start() aktiviert ist, wird der Seiteninhalt im Speicher zwischengespeichert Bevor der Dateiheader gesendet wird, wird die Seitenausgabe automatisch gelöscht oder auf die Rückgabe von ob_get_contents gewartet oder von ob_end_clean angezeigt. Die Freigabe kann bei der Generierung statischer Seiten gut genutzt werden und kann sich gut in Vorlagen widerspiegeln Eine Möglichkeit, aber es ist vorübergehend und keine gute Möglichkeit, unser Problem zu lösen. Darüber hinaus gibt es in ASP eine Objektanwendung, die auch ein bisschen Caching speichern kann php, ich habe bisher noch keine Entwickler gesehen, die solche Objekte erstellt haben. Die asp.net-Seiten-Caching-Technologie verwendet Viewstate und der Cache ist eine Dateizuordnung (nicht unbedingt korrekt). . Wenn die Datei nicht geändert wird und keine Zeitüberschreitung auftritt (Hinweis 1), wird der Cache gelesen und das Ergebnis zurückgegeben. Schauen Sie sich für Ideen diesen Quellcode an:


PHP:[In Zwischenablage kopieren]
Klassencache{
/*
Klassenname: Cache
Beschreibung: Steuerung zum Zwischenspeichern von Daten, $cache_out_time ist ein Array zum Speichern des Caches Datumsüberschreitung.
Version: 1.0
Autor: old farmer cjjer
Letzte Änderung:26.2.2006
Autoren-URL: http://www.cjjer.com
*/
private $cache_dir;
private $expireTime=180;//Die Cache-Zeit beträgt 60 Sekunden
function __construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn('Die Cache-Datei existiert nicht und kann nicht erstellt werden, sie muss manuell erstellt werden.'); ;
}
}
$this->cache_dir = $cache_dirname; 🎜>
function get_url() {
if (!isset($_SERVER['REQUEST_URI'])) {
$url = $_SERVER['REQUEST_URI'] ;
}else{
$url = $_SERVER['SCRIPT_NAME'];
$url .= (!empty($_SERVER['QUERY_STRING']) : ''; >}

return $url;
}

function warn($errorstring){
echo "Ein Fehler aufgetreten:

".$errorstring."
";
}

function cache_page( $pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){
$this->warns('Cache-Datei kann nicht geöffnet werden.');//trigger_error
return false; >}
if(!flock($fso,LOCK_EX)){//LOCK_NB, exklusive Sperre
$this->warns('Cache-Datei kann nicht gesperrt werden.') ;//trigger_error
return false;
}
if(!fwrite($fso,$pagedata)){//Write byte stream, serialize writes other formats
$this-> ;warns('In Cache-Datei kann nicht geschrieben werden. ');//trigger_error
return false;
}
flock($fso,LOCK_UN);//Release lock
fclose(
return true;

function display_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn('Cache-Datei konnte nicht gelesen werden.');//trigger_error
return false;
}
echo 'Cache-Datei lesen:'.$cacheFile;
$fso = fopen($cacheFile, ' r');
$data = fread($fso, filesize($cacheFile));
return $data; ($cacheFile='default_cache.txt'){
$cacheFile = $this->cache_dir."/".$cacheFile;
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time ()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$ data="von hier aus können wir es von MySQL erhalten Datenbank, Aktualisierungszeit ist ".date('l dS of F Y h:i:s A').",Ablaufzeit ist:" .date('l dS of F Y h:i :s A',time()+$this->expireTime)."----------"
$this->cache_page ($cacheFile,$data);}
return $data;


}


Ich werde diesen Code Zeile für Zeile erklären
3. Programmanalyse

Diese Cache-Klasse (es gibt keinen Grund zur Angst. Bitte lesen Sie weiter) heißt Cache und hat 2 Attribute:


CODE:[Kopieren nach clipboard]private $cache_dir;
private $expireTime=180;
$cache_dir ist das übergeordnete Verzeichnis des Website-Verzeichnisses, in dem die zwischengespeicherten Dateien abgelegt werden, $expireTime (Anmerkung 1) ist die Ablaufzeit unserer zwischengespeicherten Daten, Hauptsächlich diese Idee:
Bestimmen Sie beim Laden von Daten oder Dateien zunächst, ob die Cache-Datei vorhanden ist, geben Sie false zurück und ob die Summe aus der letzten Änderungszeit der Datei und der Cache-Zeit größer als die aktuelle Zeit ist ist größer, bedeutet dies, dass der Cache nicht abgelaufen ist. Wenn er kleiner ist, bedeutet dies, dass die Cache-Datei nicht abgelaufen ist. Wenn false zurückgegeben wird, werden die Originaldaten gelesen, in die Cache-Datei geschrieben Die Daten werden zurückgegeben.

Dann schauen Sie sich das Programm an:


PHP:[In Zwischenablage kopieren]
function __construct($cache_dirname){
if(!@ is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn( 'Die Cache-Datei existiert nicht und kann nicht erstellt werden. Sie muss erstellt werden manuell.');
return false;}
}
$this->cache_dir = $cache_dirname; Wenn die Klasse zum ersten Mal instanziiert wird, wird eine Standardfunktion mit Parametern zum Zwischenspeichern des Dateinamens erstellt. Wenn die Datei nicht vorhanden ist, erstellen Sie einen Ordner mit Bearbeitungsberechtigungen und lösen Sie eine Ausnahme aus, wenn die Erstellung fehlschlägt Alle unsere Cache-Dateien befinden sich unter diesem Ordner


PHP:[In die Zwischenablage kopieren]
function __destruct( ){
echo 'Cache class bye. ';
}



Dies ist der Destruktor der Klasse class. Zur Demonstration geben wir eine Zeichenfolge aus, die angibt, dass wir die Cache-Klassenressource erfolgreich freigegeben haben
PHP:[In Zwischenablage kopieren]
Funktionswarnung($errorstring){
echo „ tritt auf Fehler:
“.$errorstring ."
";



Diese Methode gibt Fehlerinformationen aus PHP:[In Zwischenablage kopieren]
function get_url() {
if (!isset($_SERVER['REQUEST_URI'])) {
$url = $ _SERVER['REQUEST_URI']; }else{
$url = $_SERVER['SCRIPT_NAME']; '';
}

return $url;
}



Diese Methode gibt die Informationen der aktuellen URL zurück, das habe ich schon oft gesehen Menschen im Ausland tun dies hauptsächlich im Caching von x.php?page=1, x.php?page=2 und anderen derartigen Dateien. Der hier aufgeführte Zweck besteht darin, die Cache-Funktion zu erweitern this->warns('Cache-Datei kann nicht geöffnet werden.');//trigger_error
return false
}
if(!flock($fso,LOCK_EX)){// LOCK_NB, exklusive Sperre
$this->warns('Cache-Datei kann nicht gesperrt werden.');//trigger_error
return false;
}
if(!fwrite($fso,$ pagedata)){/ /Byte-Stream schreiben, serialisieren, schreibt andere Formate
$this->warns('Cache-Datei kann nicht geschrieben werden.');//trigger_error
return false
}
flock($fso, LOCK_UN);//Sperre aufheben
fclose($fso);
return true;

cache_page-Methode wird separat übergeben. Was eingegeben wird, ist der zwischengespeicherte Wert Dies ist die Methode zum Schreiben von Daten in die Datei. Rufen Sie dann das Handle auf, um die Datei zu sperren, und geben Sie schließlich das Handle frei Bei jedem Schritt wird möglicherweise dieser Kommentar angezeigt:

In Byte-Stream schreiben, serialisieren, um andere Formate zu schreiben
Übrigens, wenn wir ein Array erstellen möchten (kann das sein). erfolgt aus der MySQL-Datenbank. Die ausgewählte Abfrage (mit Ausnahme der Ergebnisse) wird mit der Serialisierungsfunktion geschrieben und der ursprüngliche Typ wird mit der Funktion „unserialize“ gelesen: [In Zwischenablage kopieren]
Funktion display_cache( $cacheFile){
if(!file_exists($cacheFile)){
$this->warn('Cache-Datei konnte nicht gelesen werden.');//trigger_error
return false;
echo 'Cache-Datei lesen:'.$cacheFile;
//return unserialize(file_get_contents($cacheFile));
$fso = fopen($cacheFile, 'r'); = fread($fso, filesize($cacheFile));
fclose($fso>}



Dies ist die Methode von Cache nach Dateinamen lesen: Öffnen Sie die Datei direkt und lesen Sie sie vollständig. Wenn die Datei nicht vorhanden ist oder nicht gelesen werden kann, können Sie den Cache natürlich neu generieren >
Funktion readData($cacheFile=' default_cache.txt'){
$cacheFile = $this->cache_dir."/".$cacheFile
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$data="von hier aus können wir es aus der MySQL-Datenbank abrufen, Aktualisierungszeit ist ".date(' l dS of F Y h:i:s A').", die Ablaufzeit beträgt:".date('l dS of F Y h:i:s A',time()+$this-> ; ExpireTime)."---------";
$this->cache_page($cacheFile,$data);
return $data; 🎜 >


Diese Funktion ist die Methode, die wir aufrufen. Sie kann als Schnittstellenmethode geschrieben werden. Sie verwendet die eingehenden Parameter, um zu bestimmen, ob die Datei vorhanden ist und ob die letzte Änderungszeit der Datei + abgelaufen ist ist die aktuelle Zeit überschritten (wenn sie größer ist als Zeigt an, dass sie nicht abgelaufen ist). Wenn die Datei nicht existiert oder abgelaufen ist, laden Sie die Originaldaten neu. Der Einfachheit halber ist unsere direkte Quelle eine Zeichenfolge kann die Cache-Klasse von einer bestimmten Klasse erben, um die Daten aus der Datenbank abzurufen.

4. Ergänzende Erklärung und Schlussfolgerung

Hinweis 1: Sie können die Cache-Zeit selbst anpassen. Sie können Arrays, XML, Cache usw. entsprechend Ihrer Bequemlichkeit lesen. Es ist erwähnenswert, dass die Cache-Zeit (dh der zwischengespeicherte Schlüssel) auch durch den Cache gesteuert wird . Sie legen den zu aktualisierenden Schlüssel im Cache ab, wodurch sich der gesamte Kampf sehr einfach steuern lässt Eine konfigurierte Klasse und dann Klassen schreiben, die mit der Datenschicht interagieren (z. B. Klassen, die mit MySQL interagieren). Diese Cache-Klasse erbt die Dateninteraktionsklasse und kann die Datenbank sehr einfach lesen Hier besprochen. Ich habe Zeit, es ausführlich mit Ihnen zu besprechen.

Besonderer Hinweis: Diese Klassendatei ist für PHP5 und höher. Bitte verwenden Sie keine Klassen für andere Versionen Achtung auf die chinesische PHP-Website (www.php.cn)!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage