Heute gibts mal wieder was aus der Ecke der nützlichen Sachen.
Wie einige von euch vielleicht wissen, habe ich seit einigen Monaten ein VServer.
Davor war ich mit all meinen Webseiten bei pytal.de, wo auch jetzt noch einige Seiten von mir liegen.
Bei Pytal gab es immer so eine kleine Statistik wo man zumindest sehen konnte, wie viele User auf der Seite waren, daher hatte ich mir nie wirklich Gedanken gemacht eine eigene Statistik auftzustellen. Für mich ist sowas eigentlich auch gar nicht wichtig, ich möchte im Prinzip nur ab und an mal sehen, wie viele Leute denn auf der Webseite waren.
Naja jetzt mit einem eigenen Server gibt es diese Statistik von Pytal natürlich nicht mehr, also musste was eigenes her.
Piwik …. schon viel von gelesen, aber noch nie ausprobiert.
Die Benutzung ist ja wirklich leicht, einfach den Tracking-Code, der von Piwik generiert wird, auf die Webseite packen und gut ist.
Aber bei jeder Webseite die neu auf den Server kommt immer in den Code eingreifen und evtl. bei einem Update drauf achten, dass der Tracking-Code nicht verloren geht, ist auf die Dauer bestimmt nervig. Was muss also passieren? Richtig, der Code muss Automatisch in die Webseiten eingebettet werden. Aber wie?
Bei Pytal waren die Werbeeinblendungen auf der Webseite auch immer automatisch eingebunden, wie machen die das nur? Ich habe einfach mal eine Email geschrieben und bekam auch direkt eine Antwort, dass es sich dabei um ein selbst geschriebenes Apache Modul handelt.
Ok, das ist ein bisschen zu viel den guten, ich möchte doch einfach nur ein bisschen dynamischen Code ans Ende jeder Webseite einfügen. Eine Idee dafür, lieferte die Email von Pytal direkt mit, ich wurde auf mod_layout hingewiesen.
Bei der Beschaffung dieses Modules traten jedoch einige Probleme auf, da ich die Webseite, wo man das ganze Downloaden sollte, nicht öffnen konnte.
Also suchte ich erst einmal ein bisschen weiter. Nach einigen Minuten hatte ich die Lösung gefunden … naja das dachte ich zumindest.
auto_append_file in der php.ini war für mich erst einmal die Lösung des Problems. Heute morgen habe ich das ganze dann auf meinem Server getestet, natürlich ohne Erfolg. Das Skript wurde zwar geladen und ausgeführt, allerdings bei jeder PHP-Datei. Diese Aktion zwang dann meinen VServer in die Knie … und so war meine Webseite nicht erreichbar, bis ich nach 2 Stunden wieder aus der Schule kam.
auto_append_file ist also keine Lösung … aber was benutze ich dann? Vielleicht noch einmal mod_layout probieren? Doch auch diesmal hatte ich keinen Erfolg, beim Download. Bei der suche nach Alternativen fand ich dann mod_injection. Aber auch hier musste ich feststellen, dass die Seite zum Downloaden offline war.
Was mache ich nun also?
Nach einiger Zeit des googelns, stieß ich auf einen Blog Artikel, welcher erklärt, wie man mittels mod_substitute und mod_include Code an das Ende der Seite einfügt.
Aufgrund dieses Beispiels habe ich dann folgenden Code in meine httpd.conf eingefügt:
<IfModule substitute_module>
<IfModule include_module>
FilterDeclare Sub
FilterProvider Sub SUBSTITUTE resp=Content-Type $text/html
FilterDeclare SSI
FilterProvider SSI INCLUDES resp=Content-Type $text/html
Options +Includes
FilterChain +Sub +SSI
Substitute "s|</body.*?>|<!--#exec cmd=\"php /srv/http/include_piwik.php\"--><!--#exec cmd=\"php /srv/http/include_piwik.php\"-->$1|i"
</IfModule>
</IfModule>
Und siehe da, endlich wurde die include_piwik.php an jede Seite angehängt und der Sever ging dabei nicht in die Knie.
Wie aber stellt man es nun an, dass nicht jede Webseite getrackt wird? Und dazu auch die Webseiten unterschieden werden?
Bei einem kurzen Blick auf den von Piwik erstellten Tracking-Code sieht man, dass dort eine ID gesetzt wird. Also muss man nur die ID der Seite herausfinden & in den Tracking-Code einsetzen. Schon kann man die Webseiten unterscheiden.
Ich habe das ganze wie folgt gelöst:
<?php
// +----------------------------------------------------------------------+
// | Copyright (c) 2012 DasLampe <daslampe@lano-crew.org> |
// | Encoding: UTF-8 |
// +----------------------------------------------------------------------+
$url = $_SERVER['SERVER_NAME'];
if(substr_count($url, '.') >= 2)
{
$url = substr($url, strrpos($url, '.', -4)+1);
}
$result = simplexml_load_file("http://nixmuss-design.de/services/piwik/index.php?module=API&method=SitesManager.getSitesIdFromSiteUrl&url=http://".$url."/&format=XML&token_auth=[AUTH TOKEN]");
if(!empty($result))
{
?>
<!-- Piwik -->
<script type="text/javascript">
var pkBaseURL = (("https:" == document.location.protocol) ? "https://nixmuss-design.de/services/piwik/" : "http://nixmuss-design.de/services/piwik/");
document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
</script><script type="text/javascript">
try {
var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", <?= $result->row[0]->idsite; ?>);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
} catch( err ) {}
</script><noscript><p><img src="http://nixmuss-design.de/services/piwik/piwik.php?idsite=<?= $result->row[0]->idsite; ?>" style="border:0" alt="" /></p></noscript>
<!-- End Piwik Tracking Code -->
<?php
}
else
{
echo $url;
}
?>
</body>
Piwik läuft bei mir also unter der URL meiner Gewerbe Webseite http://nixmuss-design.de. Die ID jeder Seite finde ich über die Piwik API heraus. Den Zugriff auf diese Daten habe ich einem Benutzer erlaubt, von welchem ich den Token Key übergebe.
Wenn ich die ID habe, dann setze ich diese einfach in den Tracking-Code ein und fertig.
Eine Besonderheit ist, dass Subdomains als die normale Domains getrackt werden, somit muss ich zum Beispiel blog.andreflemming.de nicht extra in Piwik eintragen, sondern der Zugriff wird unter andreflemming.de gespeichert.
Sollte eine Webseite nicht in Piwik auftauchen, aber trotzdem bei mir auf dem Server liegen, dann wird einfach nur ein </body> ausgegeben.
Ich hoffe diese kleine Erklärung, die irgendwie mehr Text als alles andere geworden ist, hilft einigen Leuten, bei der Lösung ähnlicher Probleme.