So, heute mal ein Hardcore-Tech-Thema
Nachdem ich mich in letzter Zeit viel mit Wordpress und MySQL-Optimierung beschäftigt habe hier ein paar Dinge die bei mir geholfen haben Wordpress zu beschleunigen, ohne aber ein Caching-Plugin zu verwenden:
1. Persistent MySQL-Verbindungen
Wordpress ist so konfiguriert das es bei jedem Zugriff auf eine Seite immer eine neue Verbindung zur Datenbank macht. Das ist ok da damit Wordpress auf sehr vielen Konfigurationen funktioniert, bringt aber jede Menge Overhead, da immer Username und Passwort geschickt werden muss, etc.
PHP bietet die Möglichkeit Datenverbindungen zu Cachen, d.h. Es wird eine Pool an Verbindung zu MySQL hergestellt und jedesmal wenn eine Seite eine Verbindung zur Datenbank braucht wird aus dem Pool eine bereits bestehende Verbindung verwendet, somit muss sich die Seite nicht immer neu einloggen und spart Zeit.
in Wordpress läßt sich diese Funktion sehr einfach einschalten, einfach in der Datei “wp-includes/wp-db.php” folgende Zeile ändern:
$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
in:
$this->dbh = @mysql_pconnect($dbhost, $dbuser, $dbpassword);
Schon verwendet Wordpress Permanente Verbindungen, das sieht man daran das z.B. im MySQL-Administrator immer ein paar Verbindungen offen sind.
Wichtig ist auch zu überprüfen ob die “max_connections” in “my.cnf” für den Mysql-Server auch einen entsprechend hohen Wert haben, ansonsten gibts Probleme (500 reichen bei mir locker und auf dem Server laufen noch andere Datenbankapplikationen). Außerdem muss natürlich in der “php.ini” folgendes gesetzt sein:
mysql.allow_persistent = On
Weiters muss die Anzahl der Permanenten Verbindungen in der “php.ini” eingestellt werden (z.B. mysql.max_persistent = -1 für unbegrenzt).
Hat bei mir die Seiten subjektiv beschleunigt, aber vor allem aber etwas Load von Server genommen. Habe auch bis jetzt keinerlei Probleme mit Addons oder ähnlichem (und ich hab viele Addons laufen).
2. PHP-Accelerator verwenden
Für PHP gibt es mehrere Addons die PHP-Skripte vor kompilieren und dann nicht jedesmal das Skript neu übersetzt werden muss wenn eine Seite aufgerufen wird, das spart recht viel Rechenzeit. Ich haben XCache getestet, soll das beste sein nur leider lief es auf meinem Server nicht (Apache ist immer mit einem Core-Dump abgestürzt, obwohl selbst kompiliert). Also hab ich eAccelerator getestet und das läuft wunderbar (die Installationsanleitung ist auch brauchbar). In der Konfiguration (in “php.ini“) hab ich den Speicher für den Cache auf 100MB gestellt (drei Wordpress-Installation und psa-horde), geht sich genau aus
Damit Wordpress gut mit eAccelerator zusammenarbeitet gibt es noch ein Plugin (sowohl für XCache als auch eAccelerator), läuft sehr gut.
Die Geschwindigkeitsverbesserung war gewaltig, vor allem die Response-Time, war aber klar, kenne den Effekt auch von “mod_perl“.
3. MySQL tunen
Als nächstes geht es der Datenbank an den Kragen. Dieses “MySQL Performance Tuning Primer Script” gibt sehr gut Auskunft wo etwas mit der MySQL-Konfiguration nicht stimmt, hat mir sehr viel geholfen (musste unter anderem den “table_cache" als auch den “key_buffer" in meiner “my.cnf” erhöhen) und MySQL schnurrt jetzt wieder.
Hilfreich ist auch den Query-Cache in “my.cnf” einschalten:
query_cache_size= 16M
query_cache_type=1
query_cache_min_res_unit = 4K
Setzt den Cache auf 16 Megabyte, reicht bei mir, einfach testen und nach ein paar Tagen das oben genannte Skript nochmals laufen lassen, dann sieht man ob genug oder nicht. das “query_cache_min_res_unit” soll die Fragmentierung des Caches durch kleine Ergebnisse (anscheinend oft in Wordpress der Fall) verringern.
Das MySQL-tunen hat bei mir geholfen die Last von MySQL zu nehmen wenn andere Skripts, die sehr viel auf die Datenbank zugreifen, laufen. Aber auch für Wordpress hat es dadurch eine Geschwindigkeitssteigerung gegeben.
Was auch der Performance nutzt ist in regelmäßigen Abständen ein “Optimize Table” über alle Wordpress-Tabellen auszuführen, das optimiert die Indizes wieder.
Das waren meine Tipps für Wordpress, wenn es noch andere gibt oder ihr der Meinung seit das man dies oder das eher nicht machen sollte einfach melden!
PS: nicht vergessen, zuerst ein Backup machen
und natürlich sind alle Angaben ohne Gewähr!