Tobi’s Blog

Gedanken zur Softwareentwicklung und anderes

Archiv für die 'Programmierung' Kategorie

WordPress-Mythen: Beschleunigung mit Themenoptimierung

Erstellt von Tobi am 9. Februar 2009

Bei meinen Recherchen wie ich meinem etwas leistungsschwachen Server noch etwas von der Last mit Wordpress abnehmen kann, bin ich über diesen Artikel bzw. dessen englische Quelle gestolpert, die sich merkwürdig anhörten. Die Artikel sind zwar von Anfang 2008, womit das Verhalten ggf. nur bei alten WP-Versionen autritt, die Kommentare reichen aber bis Dezember 2008 wo schon die aktuelle Version im Umlauf war.

Es geht darum, dass man Wordpress bzw. die Themen damit schneller machen kann wenn man die Config-Angaben in den Templates statisch hinterlegt. Es wird behauptet dass damit [...]you can remove 11 queries to the database, and this can highly speed up your theme[...].

Ein kurzer Test am eigenen Blog belegt, dass das nicht stimmt. Die Config-Werte werden, so wie sich das auch gehört, am Stück eingelesen und Programmintern gecacht. Das macht den Optimierungseffekt der vorgeschlagenen Maßnahmen zunichte. Außer man gehört der Erbsenzähler-PHP-Echo-Statt-Print-Benutzen Fraktion an, dann sollte man das trotzdem unbedingt machen ( sorry Daniel, aber in dieser Disskusion ist noch nicht das letzte Wort gefallen ;)

Und so kann man’s selber testen:

MySQL Query-Log einschalten
vi /etc/mysql/my.cnf die Zeile #log = /var/log/mysql/mysql.log auskommentieren
MySQL neu starten (reload reicht nicht!)
sudo /etc/init.d/mysql restart
Abfrage starten
Den Blog ein mal im Browser aufrufen

Die Abfragen werden in der Datei /var/log/mysql/mysql.log geloggt. Danach sollte man, wenn der Blog live im Netz steht, das Logging schleunigst wieder abschalten. Erstens bremst es MySQL stark aus und zweitens wird die Datei sonst schnell sehr groß.

Bei mir ergeben sich ganze 23 Abfragen plus Connect und Disconnect. Die Config-Tabelle selbst wird nur zwei mal abgefragt und keines der angeblich wegoptimierten Abfragen ist dabei (siehe Liste weiter unten). Und in meinem Thema stehen die Config-Angaben nicht statisch drin. Alle anderen Abfragen betreffen den Inhalt. Alles in allem wenig Optimierungsbedürftig.

Fazit

Auch wenn man oft den Glauben schon verloren hat, manchmal arbeiten Programme auch mal so wie es sich gehört. Selbst in PHP geschriebene *duckUndWegrenn*

Hier mal meine komplette Liste das SQL-Abfragen beim Aufruf der Startseite (die IDs sind anonymisiert). Bei Unterseiten ist das ähnlich, nur kommen da noch Abfragen über die Kategorien dazu:

Connect wp@localhost on
Init DB wp
SELECT option_value FROM wp_options WHERE option_name = 'siteurl'
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag') AND tr.object_id IN (301, 302, 303, 304, 305) ORDER BY t.name ASC
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (301, 302, 303, 304, 305)
SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('category') ORDER BY t.name ASC
SELECT object_id, term_taxonomy_id FROM wp_term_relationships INNER JOIN wp_posts ON object_id = ID WHERE term_taxonomy_id IN (1,2,3,4,5,6,7,8,9) AND post_type = 'post' AND post_status = 'publish'
SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('link_category') AND tt.count > 0 ORDER BY t.name ASC
SELECT * , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated FROM wp_links INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = 'Y' AND ( tt.term_id = 16 ) AND taxonomy = 'link_category' ORDER BY link_name ASC
SELECT * , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated FROM wp_links INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = 'Y' AND ( tt.term_id = 15 ) AND taxonomy = 'link_category' ORDER BY link_name ASC
SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC
SELECT * FROM wp_posts WHERE (post_type = 'page' AND post_status = 'publish') ORDER BY post_title ASC
SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 10
SELECT * FROM wp_comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 5
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 11 AND comment_parent = 0 AND comment_date_gmt < '2009-02-05 22:13:29'
SELECT * FROM wp_posts WHERE ID = 11 LIMIT 1
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 12 AND comment_parent = 0 AND comment_date_gmt < '2009-01-19 23:15:53'
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 13 AND comment_parent = 0 AND comment_date_gmt < '2009-01-19 23:09:05'
SELECT * FROM wp_posts WHERE ID = 13 LIMIT 1
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 14 AND comment_parent = 0 AND comment_date_gmt < '2009-01-19 14:35:26'
SELECT * FROM wp_posts WHERE ID = 14 LIMIT 1
SELECT COUNT(comment_ID) FROM wp_comments WHERE comment_post_ID = 15 AND comment_parent = 0 AND comment_date_gmt < '2009-01-05 10:24:01'
SELECT * FROM wp_users WHERE ID = 7 LIMIT 1
SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 7
Quit

Abgelegt unter Programmierung, Technik | 3 Kommentare »

Probleme beim Dokumentendownload im IE

Erstellt von Tobi am 5. Juli 2008

Für ein altbekanntes Problem habe ich jetzt die offizielle Fehlermeldung mit einem interessanten Kommentar gefunden. Um folgendes Problem geht es:

Wenn im IE ein z.B. PDF-Dokument geöffnet wird, z.B. mit dem InlineViewer, und der Server das cachen per Header verbietet, kommt beim ersten Aufruf des Dokumentes ein “Datei ist ungültig/nicht vorhanden”.

Um das Problem zu umgehen muss die no-cache Angabe entfernt werden. Herausgefunden wurde das nur in mühsamer Kleinarbeit.

Bei Microsoft selbst ist das Verhalten ebenfalls dokumentiert unter http://support.microsoft.com/?id=316431. Dort kann man folgendes lesen:

Status: Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Ich will ja nix sagen, aber wenigstens ein wenig einfallsreicher hätte die Ausrede schon sein können. Das schnöde “It’s not a bug, it’s a feature” ist schon so dermaßen abgelatscht…

Abgelegt unter Programmierung | 1 Kommentar »

Schlechte CPAN-Module

Erstellt von Tobi am 12. März 2008

Heute ist mir mal wieder (schmerzhaft) klar gemacht worden, dass es viel Mist im CPAN gibt. Man tendiert halt auch sehr leicht dazu, ein fertiges Modul einfach zu benutzen. Wenig Arbeit, schnelle Ergebnisse. Aber das geht eigentlich immer schief. Die Frage ist nur, wie schlimm die Fehler sind.

Mein konkretes Beispiel: das Modul HTML::Tidy, was auch in anderen Modulen öfter verwendet wird, ist ein wenig Bug-verseucht. Das ist mir leider erst NACH dem Produktiveinsatz aufgefallen. Das Encoding wird von ISO nach UTF oder anders herum durchgeführt, ohne dass man das mitgeteilt bekommt. Am Ende hatte ich hunderte schadhafte Datenbankeintragungen :(

Fazit: wenn man ein CPAN-Modul benutzen will, sollte man die Bugs, die Anzahl der durchgefallenen Tests, die Bewertung und den Quellcode ganz genau betrachten. Dumm ist nur, dass einige Module so viele Abhängigkeiten haben. Da ist eine komplette Prüfung ‘ne ziemliche Sysiphos-Arbeit. Aber man sonnte sich die Arbeit machen. Immer!

Abgelegt unter Perl, Programmierung | 1 Kommentar »

Perl-OO-Entwicklerhilfe: Nachtrag

Erstellt von Tobi am 18. Dezember 2007

Nachdem mich Micha heute darauf aufmerksam gemacht hab, hab ich jetzt das Modul nochmal komplett geprüft und einen Fehler im “Manifest” korrigiert. Die Datei enthält jetzt ALLE benötigten Modulklassen und lässt sich somit auch Installieren und benutzen.

Download Fukurama::Class 0.01a

PS: wenn die Datei kleiner als 35KB ist, müsst Ihr ggf euren Browsercache mal leeren :?

Das Modul ist hier im CPAN zu finden.

Abgelegt unter Allgemein, Fukurama, Perl, Programmierung | 1 Kommentar »

Perl-OO-Entwicklerhilfe endlich fertig

Erstellt von Tobi am 18. Dezember 2007

Nach immerhin 9 Monaten und 16 Tagen ist die Entwicklerhilfe “Fukurama::Class” endlich fertig. Es ist derzeit noch im Alpha-Stadium da es einige Herausforderungen bei größeren Anwendungen z.B. in Sachen Geschwindigkeit gibt. Eine größere, bereits bekannte Aufgabe ist auch, die Fehlermeldungen mit dem korrekten Caller zu versehen. Die Caller sind zur Compielzeit schwer nachvollziehbar, da der Debugger hier leider nicht weiter hilft.

Hier schon mal zum ausprobieren: Fukurama::Class 0.01a. Im CPAN ist es noch nicht hochgeladen, das wird aber noch kommen.

Nachtrag: der Link ist jetzt korrigiert. Die Datei enthielt nicht alle Klassen weil ich vergessen hatte das “Manifest” korrekt zu füllen.

Das Modul ist hier im CPAN zu finden.

Abgelegt unter Fukurama, Perl, Programmierung | 3 Kommentare »