Ich arbeite seit einiger Zeit an der Optimierung der Programmleistung und habe eine interessante Idee, die ich gerne mit Ihnen teilen möchte.
Cache ist ein typischer Anwendungsmodus der „Raum-für-Zeit“-Strategie und eine wichtige Methode zur Verbesserung der Systemleistung. Durch den Einsatz von Cache kann die Anzahl der Datenbankoperationen bei großen Zugriffsvolumina deutlich reduziert werden, wodurch die Systemlast deutlich reduziert und die Systemleistung verbessert wird. Im Vergleich zum Seiten-Caching handelt es sich bei der Ergebnismenge um eine Art „Rohdaten“, die keine Formatinformationen enthält. Die Datenmenge ist relativ gering und kann erneut formatiert werden, sodass sie recht flexibel ist. Da es sich bei PHP um eine Skriptsprache handelt, die „gleichzeitig kompiliert und ausführt“, bietet sie in gewissem Umfang auch eine sehr praktische Methode zur Verwendung des Ergebnissatz-Cachings – die Verwendung des Caches durch dynamisches Einbinden des entsprechenden Datendefinitionscodesegments. Wird ein Cache auf „RamDisk“ aufgebaut, soll die Effizienz noch weiter verbessert werden. Unten finden Sie einen kleinen Beispielcode als Referenz.
// Daten mit Cache laden
Funktion load_data($id,$cache_lifetime) {
// die Rückgabedaten
$data = array();
// Cache-Dateinamen erstellen
$cache_filename = 'cache_'.$id.'.php';
// Überprüfen Sie die letzte Änderungszeit der Cache-Datei
$cache_filetime = filemtime($cache_filename);
if (time() - $cache_filetime <= $cache_lifetime) {
//** Der Cache ist nicht abgelaufen
include($cache_filename);
} anders {
//** Der Cache ist abgelaufen
// Daten aus der Datenbank laden
// ...
while ($dbo->nextRecord()) {
// $data[] = ...
}
// formatiere die Daten als PHP-Datei
$data_cache = "
while (list($key, $val) = every($data)) {
$data_cache .= "$data['$key']=array('";
$data_cache .= "'NAME'=>"".qoute($val['NAME'])."","
$data_cache .= "'VALUE'=>"".qoute($val['VALUE'])."""
$data_cache .= ";);rn";
}
$data_cache = "?>rn";
// Daten in der Cache-Datei speichern
if ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
fclose($fd);
}
}
$data zurückgeben;
}
?>
Anwendbare Situationen:
1. Die Daten sind relativ stabil, hauptsächlich Lesevorgänge.
2. Dateioperationen sind schneller als Datenbankoperationen.
3. Komplexer Datenzugriff, Zugriff auf große Datenmengen, intensiver Datenzugriff und extrem hohe Belastung der Systemdatenbank.
4. Web/DB-Trennstruktur oder Multi-Web-Einzel-DB-Struktur.
Unbestätigte Frage:
1. Ob das Lesen und Schreiben von Dateien während des gleichzeitigen Zugriffs zu Sperrproblemen führt.
2. Wie hoch ist die Leistung, wenn zu viele Datendateien beteiligt sind?
Erweiterungsideen:
1. Generieren Sie einen JavaScript-Datendefinitionscode und rufen Sie ihn auf dem Client auf.
2. Habe noch nicht darüber nachgedacht ...
Ich hoffe auf eine gemeinsame Diskussion.
Cache
Wenn Sie die Leistung Ihrer großen PHP-Anwendung verbessern möchten, ist die Verwendung von Caching ebenfalls eine gute Möglichkeit. Es stehen viele Caching-Lösungen zur Verfügung, darunter Zend Cache, APC und Afterburner Cache.
Alle diese Produkte sind „Caching-Module“. Wenn zum ersten Mal eine Anfrage nach einer .php-Datei gestellt wird, speichern sie den PHP-Zwischencode im Speicher des Webservers und antworten dann auf nachfolgende Anfragen mit der „kompilierten“ Version. Dieser Ansatz kann die Anwendungsleistung wirklich verbessern, da er den Festplattenzugriff auf ein Minimum reduziert (der Code wurde gelesen und analysiert) und der Code direkt im Speicher ausgeführt wird, wodurch der Server viel schneller auf Anfragen reagiert. Natürlich überwacht das Caching-Modul auch Änderungen in PHP-Quelldateien und speichert die Seite bei Bedarf erneut zwischen, um zu verhindern, dass der Benutzer Seiten erhält, die noch von veraltetem PHP-Code generiert wurden. Da Caching-Module die Belastung des Servers erheblich reduzieren und die Antworteffizienz von PHP-Anwendungen verbessern können, eignen sie sich sehr gut für Websites mit hoher Auslastung.
So wählen Sie diese Caching-Produkte aus
Zend Cache ist eine kommerzielle Software von Zend Technologies, dem zuvor erwähnten Unternehmen, das uns die PHP-Engine und den kostenlosen Zend Optimizer zur Verfügung stellt. Zend Cache ist in der Tat wohlverdient! Bei großen PHP-Seiten können Sie spüren, dass die Geschwindigkeit nach dem ersten Durchlauf zunimmt und der Server über mehr verfügbare Ressourcen verfügt. Leider ist dieses Produkt nicht kostenlos, aber in manchen Fällen kann es dennoch von großem Wert sein.
Afterburner Cache ist ein kostenloses Caching-Modul von Bware Technologies. Dieses Produkt befindet sich derzeit in der Beta-Version. Afterburner Cache ähnelt Zend Cache, verbessert die Leistung jedoch (noch) nicht so stark wie Zend Cache und funktioniert nicht mit Zend Optimizer.
APC ist die Abkürzung für Alternative PHP Cache, ein weiteres kostenloses Caching-Modul von Community Connect. Das Produkt ist bereits stabil genug für den formellen Einsatz und scheint die Reaktionsgeschwindigkeit auf Anfragen erheblich zu verbessern.
Über Komprimierung
Das kostenlose Apache-Modul mod_gzip von Remote Communications bietet die Möglichkeit, statische Webinhalte für Browser zu komprimieren, die diese Art der Inhaltskodierung unterstützen. Für die überwiegende Mehrheit der statischen Webinhalte funktioniert mod_gzip sehr gut. mod_gzip lässt sich einfach in Apache kompilieren und kann auch als DSO verwendet werden. Laut Remote Communications kann mod_gzip auch dynamische Inhalte aus mod_php, mod_perl usw. komprimieren. Ich habe es immer wieder versucht, aber es schien nicht zu funktionieren. Ich habe viele Foren und Artikel über mod_gzip gelesen und es scheint, dass dieses Problem voraussichtlich in der nächsten Version von mod_gzip (wahrscheinlich 1.3.14.6f) gelöst wird. Bis dahin können wir mod_gzip für die statischen Teile der Website verwenden.
Manchmal möchten wir jedoch dynamische Inhalte wirklich nicht komprimieren und müssen daher andere Wege finden. Eine Möglichkeit ist die Verwendung von class.gzip_encode.php, einer PHP-Klasse, die zum Komprimieren des Inhalts der Seite verwendet werden kann, indem bestimmte Funktionen der Klasse am Anfang und Ende des PHP-Skripts aufgerufen werden. Wenn Sie diese Lösung auf Website-Ebene implementieren möchten, können Sie diese Funktionen über die Anweisungen auto_prepend und auto_append in der Datei php.ini aufrufen. Obwohl diese Methode effektiv ist, bringt sie zweifellos mehr Overhead für Websites mit hoher Auslastung mit sich. Ausführliche Anweisungen zur Verwendung dieser Klasse finden Sie im Quellcode. Die Beschreibung des Quellcodes ist recht vollständig und der Autor erklärt Ihnen alles, was Sie wissen müssen.
PHP 4.0.4 verfügt über einen neuen Ausgabe-Cache-Handler ob_gzhandler, der der vorherigen Klasse ähnelt, jedoch eine andere Verwendung hat. Der folgende Inhalt sollte zur php.ini hinzugefügt werden, wenn ob_gzhandler verwendet wird:
Output_handler = ob_gzhandler;
Diese Codezeile veranlasst PHP, das Ausgabe-Caching zu aktivieren und alles zu komprimieren, was es aussendet. Wenn Sie diese Codezeile aus irgendeinem Grund nicht zur php.ini hinzufügen möchten, können Sie das Standardserververhalten (keine Komprimierung) auch über die .htaccess-Datei in dem Verzeichnis ändern, in dem sich die PHP-Quelldatei befindet ist wie folgt:
php_value Output_handler ob_gzhandler
Oder rufen Sie es wie folgt aus dem PHP-Code auf: ob_start("ob_gzhandler");
Die Verwendung von Ausgabe-Cache-Handles ist in der Tat sehr effektiv und stellt keine besondere Belastung für den Server dar. Es muss jedoch beachtet werden, dass Netscape Communicator komprimierte Grafiken nur unzureichend unterstützt. Wenn Sie also nicht sicherstellen können, dass alle Benutzer den IE-Browser verwenden, sollten Sie komprimierte JPEG- und GIF-Grafiken deaktivieren. Im Allgemeinen funktioniert diese Komprimierung für alle anderen Dateien. Es wird jedoch empfohlen, sie für jeden Browser separat zu testen, insbesondere wenn Sie spezielle Plug-Ins oder Datenbetrachter verwenden. Dies ist besonders wichtig.