ColdFusion: Felxible Parameter in SEO URLs

Apache , ColdFusion No Comments »

Flexible SEO URLs in ColdFusion leicht gemacht:

In unserer .htaccess notieren wir

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.cfm?q=$1 [L,QSA]

RewriteEngine on schaltet mod_reqrite ein
RewriteCond %{REQUEST_FILENAME} !-f und RewriteCond %{REQUEST_FILENAME} !-d prüfen ob die angeforderte Datei eine echte Datei oder ein Verzeichnis ist.
RewriteRule ^(.*)$ index.cfm?q=$1 [L,QSA] leitet alles was an die URL angehängt wird an unsere index.cfm und verpackt es in der URL Variable "q" (kann natürlich beliebig benannt werden).

In unserer Application.cfc machen wir dann folgendes:

public boolean function onRequestStart(){

param name="url.q" default="";

for(i=1;i lte listlen(url.q,"/"); i++){

if (i mod 2 eq 0){
structinsert(url,listgetat(url.q,i-1,"/"),listgetat(url.q,i,"/"),true);
}
}

structAppend(request, url, false);
structAppend(request, form, true);

return true;
}

Damit das Script auch ohne die Übergabe von url.q funktioniert, definieren wir url.q als Parameter.

Nun kommt das Handling von url.q. Wir lassen über url.q eine For-Schleife laufen und behandeln dabei url.q als Liste mit / als Separator. In jedem Durchlauf wird nun geprüft, ob sich unsere Zählvariable i ohne Rest durch 2 teilen lässt. Ist das der Fall, holen wir uns mit listgetat(url.q,i-1,"/") den vorhergehenden Listeneintrag und nutzen ihn als Key im URL Scope. Den aktuellen Listeneintrag holen wir mit listgetat(url.q,i,"/") und setzen ihn als Value ein. Das "true" in unserem structinsert() ermöglicht das existierende Keys überschrieben werden, was dem normalen Verhalten von URL-Parametern entspricht.

Anschließend packen wir URL und FORM Variablen in den REQUEST Scope. So können wir in Scripten auf die Variablen zugreifen, egal ob sie per URL oder über ein Formular übergeben wurden. Dabei definieren wir durch die Angabe false/true in unserem structAppend() das FORM Variablen gleichnamige URL Variablen überschreiben.

Mit diesem kleinen Script können wir nun beliebig viele Parameter im Format variable/wert an die URL anhängen:
www.example.de/var1/wert1/var2/wert2/var3/wert3/var4/wert4

Was als letztes Übergeben wird, ist dem Script egal:
www.example.de/var1/wert1/var2/wert2/var3/wert3/var4/wert4/index.html funktioniert ebenso wie www.example.de/var1/wert1/var2/wert2/var3/wert3/var4/wert4/irgendwas.txt.

MySQL: Mehr Performance durch Query-Cache

MySQL No Comments »

Im Query-Cache, der seit Version 4 zur Verfügung steht, werden Queries und deren Ergebnisse gespeichert. Wenn das gleiche Statement mehrmals benutzt wird und die betroffenen Datensätze sich nicht verändert haben, wird das Ergebnis aus dem Cache geliefert. In Szenarien, in denen häufig auf Bestandsdaten zugegriffen wird, kann dieser Cache enmorme Geschwindigkeitssteigerungen bewirken. Besonders bei komplexen Statements kann der Query-Cache sehr wirkungsvoll sein, da das zeitaufwändige Parsen der Statements entfällt.

[root@machine]mysql -uroot -prootpassword
mysql> set global query_cache_type=1;
mysql> set global query_cache_size = 67108864;
mysql> FLUSH QUERY CACHE;

67108864 Bytes = 64 MB. Das sollte für den Anfang genug Speicher sein, denn der Query-Cache wird im RAM abgelegt.

Nun besuchen wir ein paar unserer Seiten, die Datenbankabfragen enthalten und prüfen anschließend den Cache.

[root@machine]mysql -uroot -prootpassword
mysql> SHOW STATUS LIKE 'q%';

Das Ergebnis sollte in etwa so aussehen:

+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 66564920 |
| Qcache_hits | 2181 |
| Qcache_inserts | 417 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 396 |
| Qcache_queries_in_cache | 270 |
| Qcache_total_blocks | 590 |
| Questions | 4828 |
+-------------------------+----------+
9 rows in set (0.00 sec)

ColdFusion: Ladezeitoptimierung mit Combine.cfc

ColdFusion No Comments »

Viele moderne Websites nutzen aufwendige AJAX Features. Dadurch müssen teilweise mehrere Bibliotheken wie Scriptacluos, Prototype oder jQuery, so wie diverse Plugins und eigene Scripte geladen werden. Auch wenn die einzelnen Dateien nicht sonderlich groß sind, verursachen sie viele einzelne HTTP-Requests.

Hier kommt die Combine.cfc ins Spiel. Das Paket besteht aus einer combine.cfm, combine.cfc so wie verschiedenenen Java Archiven und Klassen. Die Archive yuicompressor-2.4.2.jar und combine.jar müssen, ebenso wie der Inhalt des Ordners com, zum ColdFusion Classpath hinzugefügt werden.

Nun kann man statt die Dateien einzeln zu verlinken:

<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="js/jquery.easing.1.2.js"></script>
<script type="text/javascript" src="js/jquery.corner.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.7.2.custom.min.js"></script>
<script type="text/javascript" src="js/jquery.dimensions.min.js"></script>
<script type="text/javascript" src="js/jquery.tooltip.min.js"></script>
<script type="text/javascript" src="js/jquery.dltoggle.min.js"></script>
<script type="text/javascript" src="js/funny-stuff.js"></script>

Alle Dateien über einen Link laden:

<script type="text/javascript" src="combine.cfm?files=js/jquery-1.3.2.min.js,js/jquery.easing.1.2.js,js/jquery.corner.js,js/jquery-ui-1.7.2.custom.min.js,js/jquery.dimensions.min.js,js/jquery.tooltip.min.js,js/jquery.dltoggle.min.js,js/funny-stuff.js"></script>

Combine fügt nun die einzelnen Dateien zu einer Datei zusammen, so das effektiv nur eine Datei geladen werden muss, welche zusätzlich noch komprimiert wird. Combine entfernt unter anderem alle Leerräume, wie man es z.B. von der jQuery-minified her kennt. Keine Leerzeichen, keine Leerzeilen.

Der große Vorteil liegt darin, dass die Originaldateien nicht angerührt werden. So kann man einzelne Dateien immer noch problemlos ändern oder updaten.

Das ganze funktioniert auch mit CSS Dateien!

Apache: Ladezeit durch GZip optimieren

Apache No Comments »

Die Ladezeiten einer Website lassen sich mit dem Apache enorm verkürzen. Hierzu wird das mod_deflate benötigt, welches eigentlich bei jeder Linux Distro, OS X und Windows installiert sein sollte.

Um mod_deflate nutzen zu können sind zwei Schritte notwendig.

Schritt 1
Das Modul laden. Hierfür öffnen wir die httpd.conf bzw. apache2.conf (je nach OS) und suchen nach folgender Zeile:

#LoadModule deflate_module modules/mod_deflate.so

Hier entfernen wird das #, speichern die Datei und starten den Apache neu. Bevor wir die Datei schliessen, suchen wir noch nach der Zeile:

Load config files from the config directory

Hier steht wo sich zusätzliche Konfigurationsdateien befinden müssen, damit sie geladen werden. Auf den meisten Linux Systemen sollte der Pfad /etc/httpd/conf.d lauten.

Schritt 2
Wir wechseln in den Ordner /etc/httpd/conf.d und erstellen eine leere Textdatei, die wir deflate.conf nennen. Diese füllen wir mit folgenden Anweisungen:

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|iso|tar|bz2|sit|rar|png|jpg|gif|jpeg|flv|swf)$ no-gzip dont-vary
DeflateCompressionLevel 9
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

Erklärung:
SetOutputFilter DEFLATE
Aktiviert das Modul

SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|iso|tar|bz2|sit|rar|png|jpg|gif|jpeg|flv|swf)$ no-gzip dont-vary
Setzt einen Filter, welche Dateitypen NICHT komprimiert werden sollen. Dazu gehören Binärdaten, Bilder (sind schon komprimiert), komprimierte Archive (zip, rar etc.), Flash und Flashvideo. Alles andere wird komprimiert. (Ihr könnt diese natürlich euren Bedürnissen entsprechend anpassen.)

DeflateCompressionLevel 9
Setzt die Kompressionsstärke. 9 ist die höchste Stufe, hier werden je nach Datei bis zu 75% eingespart!

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

Hier werden einige Browser ausgeklammert, von denen bekannt ist, das sie mit GZip nicht umgehen können. Diese bekommen den Inhalt unkomprimiert.

Und hier könnt ihr testen, ob die Komprimierung funktioniert und wie stark das Datenvolumen reduziert wird.

MySQL: Rettet MySQL!

No Comments »

Mehr braucht man dazu eigentlich nicht sagen!

Powered by Mango Blog. ©2012 Patrick Heppler. Design inspired by the GlossyBlue Theme © N.Design Studio.
RSS Feeds