Ihre neueste PHP / MySQL-Website ist endlich online. Und es ist großartig. Es ist jedoch nicht so schnell, wie Sie möchten, da viele SQL-Abfragen jedes Mal ausgeführt werden, wenn eine Seite generiert wird. Und darüber hinaus haben Sie das Gefühl, dass es unter schweren Lasten nicht gut skaliert. Und du hast höchstwahrscheinlich Recht.
In diesem Lernprogramm erfahren Sie, wie Sie die Reaktionsgeschwindigkeit Ihrer Website erheblich verbessern und die Skalierbarkeit für viele gleichzeitige Besucher verbessern können, indem Sie eine Cache-Schicht zwischen Ihrem Code und Ihrer Datenbank implementieren. Die gute Nachricht ist, dass es ziemlich einfach ist und in wenigen Minuten erledigt werden kann!
Memcached ist ein leistungsfähiges In-Memory-Datencachesystem.
Moderne Websites und Webanwendungen verwenden viele Daten. Es ist nicht ungewöhnlich, dass 20 oder sogar 30 SQL-Abfragen in einer einzigen Seitengenerierung gezählt werden. Multiplizieren Sie diese Anzahl mit einer großen Anzahl von Besuchern, und Sie erhalten oft eine überlastete Datenbank und Seiten, die Sekunden benötigen, um generiert und an den Client gesendet zu werden.
Das Tool, das wir heute zur Verbesserung der Leistung verwenden werden, heißt Memcached. Es ist ein leistungsfähiges In-Memory-Daten-Caching-System. Oder anders ausgedrückt, eine sehr schnelle Anwendung, die auf Ihrem Server ausgeführt wird und einen Teil des verfügbaren Speichers zum Speichern eines assoziativen Datenfelds verwendet. Sie können Memcached bitten, zwei Dinge zu tun:
V
mit dem Schlüssel K
V
mit der Taste gespeichert K
Das sieht minimalistisch aus, aber dank dieser beiden Funktionen können Sie viel tun, wie wir bald sehen werden. In der Tat kann Memcached noch einiges mehr tun, aber alle sind an das Speichern oder Abrufen von Daten gebunden.
Die Installation von Memcached auf modernen Linux-Distributionen ist recht einfach:
sudo apt-get install memcached
sudo emerge install memcached
sudo yum install memcached
Nach der Installation wird Memcached bei jedem Start des Servers automatisch gestartet. Sie können den für Memcached reservierten Speicherplatz zusammen mit anderen Optionen in der Konfigurationsdatei festlegen (/etc/memcached.conf
). 64 MB sind standardmäßig zugewiesen. Die Konfigurationsdatei enthält auch die IP-Adresse und der Port, an den Memcached gebunden ist. Standardwerte (127.0.0.1
und 11211
) sind für eine Standardeinstellung ausreichend.
Wir möchten Daten von Ihren PHP-Skripts speichern und abrufen. Dies bedeutet, dass wir eine Möglichkeit benötigen, eine Verbindung zu Memcached von PHP herzustellen. Dafür installieren wir die Erweiterung "Memcache" für PHP. Da es sich um eine PECL-Erweiterung handelt, ist es sehr einfach, mit "pecl" zu installieren, indem Sie den folgenden Befehl eingeben:
sudo pecl install memcache
Es gibt zwei PHP-Erweiterungen, die sich auf Memcache beziehen: "Memcache" und "Memcached" (Beachten Sie das "d" in der zweiten). Beide sind sehr ähnlich, aber der erste hat einen geringeren Platzbedarf. In diesem Tutorial verwenden wir den leichteren Memcache. Nach der Installation sollte diese Erweiterung aktiviert sein und die Memcache-bezogenen Funktionen sollten jetzt für Ihre PHP-Skripts verfügbar sein.
Unsere Arbeit hier basiert auf folgenden Annahmen:
Wir möchten unsere Daten auch so speichern, dass wir sie effizient abrufen können.
Im Allgemeinen möchten wir unsere Daten in einer permanenten Umgebung (beispielsweise unserer MySQL-Datenbank) speichern. Wir möchten unsere Daten jedoch auch so speichern, dass wir sie effizient abrufen können, auch wenn der Speicher nicht dauerhaft ist. Am Ende werden wir es also tun zwei Kopien unserer Daten : einer wird in MySQL und der andere in Memcache gespeichert.
Hier sind die Schritte, die wir unternehmen müssen, um dies zu erreichen:
INSERTs
und Aktualisierung
) wird sowohl in MySQL als auch in Memcached ausgeführtSELECTs
) wird in Memcached ausgeführt und greift im Fehlerfall auf MySQL zurückAn dieser Stelle sehen Sie wahrscheinlich, welche Teile Ihres Codes geändert werden müssen: Teile, an denen Sie Daten schreiben, und Teile, an denen Sie Daten lesen. Wenn Ihr PHP-Code gut strukturiert ist, sollten Sie Ihren Datenzugriffscode in Funktionen oder sogar bessere Klassen eingepackt haben. In diesem Fall sollte die Aktualisierung Ihrer Website sehr schnell erfolgen. Wenn nicht, haben Sie vielleicht etwas mehr Arbeit.
Erstellen Sie zunächst eine Verbindung zu unserem Memcached-Server. Hier ist der Code, den Sie früh in Ihren PHP-Skripts verwenden sollten:
// Verbindungskonstanten define ('MEMCACHED_HOST', '127.0.0.1'); define ('MEMCACHED_PORT', '11211'); // Verbindungserstellung $ memcache = new Memcache; $ cacheAvailable = $ memcache-> connect (MEMCACHED_HOST, MEMCACHED_PORT);
Zu diesem Zeitpunkt haben wir eine Verbindung zu unserem Memcache-Server hergestellt. Es ist vielleicht gescheitert, aber wir wissen es dank der $ cacheAvailable
Variable.
Lassen Sie uns in den Datenspeicher eintauchen. Wir werden ein Beispiel nehmen, um die Dinge klarer zu machen - einen Online-Shop. Wir haben ein Skript namens edit_product.php
deren Zweck es ist, die Daten eines Produkts in unserer Datenbank zu speichern. Jedes unserer Produkte verfügt über folgende Informationen:
Irgendwann in unserem edit_product.php
Code, führen wir ein EINFÜGEN
oder AKTUALISIEREN
SQL-Abfrage, deren Zweck es ist, die Daten dieses Produkts in unsere MySQL-Datenbank zu schreiben. Es könnte genau so aussehen:
// Wir haben unsere Daten validiert und bereinigt // Wir sind mit mysql_real_escape_string () jedem risikoreichen Char entkommen // Jetzt wollen wir sie in unserer Datenbank speichern $ sql = "INSERT INTO-Produkte (ID, Name, Beschreibung, Preis) VALUES ( $ id, '$ name', '$ description', $ price) "; $ querySuccess = mysql_query ($ sql, $ db);
Wie bereits erwähnt, möchten wir unsere Daten sowohl in unserer MySQL-Datenbank als auch auf dem Memcached-Server speichern. So gehen wir vor:
// Wir haben unsere Daten validiert und bereinigt // Wir sind mit mysql_real_escape_string () jedem risikoreichen Zeichensatz entkommen // Jetzt möchten wir sie in unsere Datenbank schreiben: $ sql = "INSERT INTO-Produkte (ID, Name, Beschreibung, Preis) VALUES ($ id, '$ name', '$ description', $ price) "; $ querySuccess = mysql_query ($ sql, $ db); // Wir haben unsere Daten in unsere Datenbank geschrieben. // Nun speichern wir den Produktnamen, die Beschreibung und den Preis in unserem Cache. // Die Methode "set" weist unseren Memcached-Server an, die mit einem bestimmten Schlüssel verknüpften Daten zu speichern, wenn ($ querySuccess = == true) // Wir bauen einen eindeutigen Schlüssel, den wir später erneut erstellen können. // Wir verwenden das Wort "Produkt" plus der Produkt-ID (z. B. "Produkt_12"). $ key = 'Produkt_'. $ id; // Wir speichern ein assoziatives Array mit unseren Produktdaten. $ Product = array ('id' => $ id, 'name' => $ name, 'description' => $ description, 'price' => $ price); // Und wir bitten Memcached, diese Daten zu speichern. $ Memcache-> set ($ key, $ product);
Zu diesem Zeitpunkt enthalten sowohl unsere Datenbank als auch unser Cache unsere Produktdaten.
Falls unser Cache nicht verfügbar ist, möchten wir auf MySQL zurückgreifen.
Lassen Sie uns jetzt unsere Daten abrufen. Nehmen wir im gleichen Beispiel an, dass unser Online-Shop ein Skript hat product.php
das zeigt ein bestimmtes Produkt. Zugriff auf die Seite product.php? id = 12
zeigt das Produkt mit der Kennung 12 an.
Irgendwann in unserem product.php
Code, führen wir ein WÄHLEN
SQL-Abfrage, deren Zweck es ist, Daten eines Produkts aus unserer MySQL-Datenbank abzurufen. Es könnte genau so aussehen:
// Wir haben unsere Daten validiert und bereinigt // Wir sind mit mysql_real_escape_string () jedem risikoreichen Zeichensatz entkommen // Jetzt wollen wir aus unserer Datenbank lesen: $ sql = "SELECT ID, Name, Beschreibung, Preis FROM Produkte WHERE ID =" . $ id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource);
Wie bereits erwähnt, möchten wir unsere Daten möglichst von unserem Memcached-Server abrufen, da dies schneller ist als der Abruf von MySQL. Falls unser Cache-Server jedoch nicht erreichbar ist oder einfach nicht die Daten speichert, die wir benötigen, möchten wir auf MySQL zurückgreifen. So gehen wir vor:
// Initialisiere unsere $ product Variable $ product = null; // Zuerst prüfen wir, ob unser Cache-Server verfügbar ist // Die Variable $ cacheAvailable wurde initialisiert, als wir eine Verbindung zu unserem Cache-Server aufnahmen, wenn ($ cacheAvailable == true) // Wir bauen den Schlüssel, den wir mit unseren Produktdaten $ key = verknüpften 'Produkt_' . $ id; // Nun bekommen wir die Daten von unserem Cache-Server. $ Product = $ memcache-> get ($ key); // Müssen wir auf MySQL zugreifen? if (! $ product) // Falls ja, weil unsere $ product-Variable immer noch null ist // Wir haben unsere Daten validiert und bereinigt // Wir haben uns mit mysql_real_escape_string () jedem riskanten Zeichensatz entzogen. // Jetzt wollen wir lesen aus unserer Datenbank: $ sql = "SELECT ID, Name, Beschreibung, Preis FROM Produkte WHERE ID =". $ id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource);
Zu diesem Zeitpunkt haben wir die benötigten Daten abgerufen. Es wurde höchstwahrscheinlich von unserem Cache aus erstellt, könnte aber von MySQL stammen, wenn der Cache nicht gefüllt war oder aus irgendeinem Grund nicht darauf zugegriffen werden konnte.
Wir haben gesehen, wie Memcached verwendet werden kann, um Ihre Website zu beschleunigen und die Datenbankbelastung zu begrenzen. Unser Beispiel basiert auf PHP und MySQL, da diese Technologien weit verbreitet sind. Dieses Prinzip ist jedoch universell und funktioniert mit vielen anderen Technologien gleich: C / C ++, Java, Python, Ruby, Perl, .Net, MySQL, Postgres, Erlang, Lua, Lisp, Cold Fusion, Ocaml und io sind zusammen mit PHP im offiziellen Memcached-Wiki aufgeführt.
Wie bereits kurz erwähnt, bietet Memcached mehr Funktionen als die einfachen Set- und Get-Methoden, die wir oben gesehen haben. Zwei nützliche Zusatzfunktionen sind Inkrement- / Dekrement-Aktualisierungen und die Möglichkeit, eine Ablaufzeit für bestimmte gespeicherte Daten festzulegen. Beide sind zusammen mit einigen anderen in PHP verfügbar, wie Sie in der Memcache-Dokumentation sehen können.
Viel Spaß beim Implementieren auf Ihren Websites und die Verbesserung der Performance. Vielen Dank für das Lesen und bitte lassen Sie mich wissen, wenn Sie Fragen in den Kommentaren haben.