Nachdem ich zwei weniger aufwendig konfigurierte Blogs auf WordPress 3.5 aktualisiert hatte, musste ich feststellen, dass die Ausgabe des Statistik-Plugins „Semmelstatz“ nach der Ausgabe der Referer-Liste abbrach. Da ich an Semmelstatz hänge und kein anderes Statistik-Plugin eine derartige Übersicht liefert (auch wenn manche die Zahlen anzweifeln, aber dazu am Ende mehr), machte ich mich auf die Suche nach dem Fehler. Denn der ursprüngliche Entwickler Andreas „Redunzl“ Müller hatte die Arbeit an dem Plugin lange eingestellt, es war zwar von weiteren Personen übernommen worden, aber auch da hat sich seit 2011 nichts mehr getan. Also selbst Hand anlegen.
Da keine Fehlermeldungen geworfen wurden, ein Blick in den generierten Quellcode nichts ergab und auch Firebug in der Konsole keine Fehler meldete, machte ich mich auf die Suche nach möglichen Lösungsansätzen im Web. Und tatsächlich: offenbar sind etliche der mySQL-Abfragen sehr unoptimiert und können dazu führen, dass zuviel Speicher verbraucht wird. Dann wird das PHP-Speicherlimit überschritten. Bei mir liegt das bei 128 MB, bei manch einem Hoster deutlich darunter, deswegen ist das Problem bei anderen auch früher schon aufgetreten, bei mir erst mit der Installation von WordPress 3.5.
Auf der Suche nach einem offensichtlichen Fehler fiel mir auf, dass die Datenbankabfragen tatsächlich … na sagen wir mal … ineffektiv sind, weil viel mehr Daten abgerufen werden, als es nötig wäre. Und das, obwohl in den Einstellungen sogar Limits gesetzt werden können. Nur werden die dann in der eigentlichen mySQL-Query gar nicht verwendet. Ich fand in semmelstatz-statz.php in der Funktion sem_showKeyword():
$limit = $sem_options["statz_keyword_limit"];
$results = $wpdb->get_results("SELECT referer, time, ip FROM $wpdb->statz
WHERE referer != 'NULL' ORDER BY time DESC");
Da wird zwar das Limit aus der Konfiguration abgefragt, aber in der mySQL-Query nicht angewendet – und damit wird eine Menge überflüssiger Informationen aus der Statz-Datenbank geholt. Deswegen die Abfrage um ein Limit ergänzt:
$limit = $sem_options["statz_keyword_limit"];
$limit1 = $limit;
$results = $wpdb->get_results("SELECT referer, time, ip FROM $wpdb->statz
WHERE referer != 'NULL' ORDER BY time DESC LIMIT 0, $limit");
Daraufhin wurden mir allerdings nicht wie in der Konfig eingestellt zwanzig, sondern nur noch drei Suchbegriffe angezeigt, keine Ahnung, warum. Eine kleine Erhöhung des Limits brachte dann aber den gewünschten Erfolg:
$limit = $sem_options["statz_keyword_limit"];
$limit1 = $limit * 6;
$results = $wpdb->get_results("SELECT referer, time, ip FROM $wpdb->statz
WHERE referer != 'NULL' ORDER BY time DESC LIMIT 0, $limit1");
Und schon wurde wieder alles wie gehabt angezeigt:
Ein geändertes Plugin-Archiv hängt unten an (selbstverständlich alles ohne Gewähr und ohne Garantie auf Fehlerfreiheit, deswegen vor dem Einspielen: Backup. Bei mir klappts).
Noch eine Anmerkung zu den Zahlen, die Semmelstatz generiert. Ja, im Vergleich mit anderen Statistiklösungen sind die zu hoch. ich hatte aber mal einen Test gestartet, in deren Rahmen ich mehrfach unter verschiedenen IP-Adressen und mit verschiedenen Browsern von unterschiedlichen rEchnern zugegriffen habe. Google Analytics und Piwik haben nicht alle Zugriffe davon gezählt. Semmel schon. Von daher würde ich davon ausgehen, dass die Wahrheit irgendwo dazwischen Liegt, Mulder. Als Tagesüberblick über Besucher, Referer, Suchwörter und beliebte Posts bleibt Semmelstatz ein durchaus hilfreiches Plugin.
Ich gehe davon aus, dass weitere Optimierungen der mySQL-Abfragen möglich sind. Wenn ich Zeit habe, kümmere ich mich mal drum.
Download: Semmelstatz 3.3.2mod
WordPress-Logo Copyright Automattic