<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lieber Linux &#187; Apache</title>
	<atom:link href="http://www.lieber-linux.de/tag/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lieber-linux.de</link>
	<description>Linux und Open Source Software im Blog</description>
	<lastBuildDate>Thu, 26 Jan 2012 17:58:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Memcache &#8211; gib mir Speed!</title>
		<link>http://www.lieber-linux.de/2009/10/memcache-gib-mir-speed/</link>
		<comments>http://www.lieber-linux.de/2009/10/memcache-gib-mir-speed/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 11:28:22 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipp]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=625</guid>
		<description><![CDATA[Ich habe diese Woche den memcache-daemon memcached in Version 1.4.2 mit der PHP-extension memcache ausprobiert und bin einfach nur begeistert. Was ist denn Memcache? Memcache ist ein Dienst, der es erlaubt, Daten im Arbeitsspeicher vorzuhalten. Daneben erlaubt er es auch noch, dies über mehrere Server zu verteilen, also ein richtiges Speicher-Netzwerk aufzubauen. Und Arbeitsspeicher ist [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe diese Woche den memcache-daemon memcached in Version 1.4.2 mit der PHP-extension memcache ausprobiert und bin einfach nur begeistert.</p>
<h3>Was ist denn Memcache?</h3>
<p>Memcache ist ein Dienst, der es erlaubt, <strong>Daten im Arbeitsspeicher</strong> vorzuhalten. Daneben erlaubt er es auch noch, dies über mehrere <strong>Server</strong> zu verteilen, also ein richtiges Speicher-Netzwerk aufzubauen. Und Arbeitsspeicher ist eine der schnellsten Zugriffsformen auf Daten, die wir zur Zeit haben. Memcache kann durch das <strong>Zwischenspeichern</strong> von Daten, die sonst mühsam aus anderer Stelle geholt werden müssen, das Leben leichter und angenehm schneller gestalten.</p>
<p><span id="more-625"></span>Dazu muss man sagen, dass ja Webanwendungen von Seitenaufruf zu Seitenaufruf jeweils neu initialisiert werden müssen. Als Benutzer in einer Sitzung (<strong>Session</strong>) ist einem das oft nicht bewusst, aber es kostet den Server bei jedem Klick eine entsprechende Zeit, die Session zu restaurieren und die Daten wieder so herzustellen, damit die nächste Aktion ausgeführt werden kann. Die Sessions werden in einer Datei auf dem Server abgelegt. Das heißt also auch Festplattenaktivität pro Klick. Das ist doof. Noch dümmer, dass man nicht wirklich viel in solch eine Session legen kann und sollte. Je größer das Session-File, desto langsamer wird jeder einzelne Aufruf. Dinge also, die nicht wirklich essentiell sind, holt man also immer wieder neu aus einer <strong>Datenbank</strong> oder anderen Quellen.</p>
<p>Daneben gibt es noch <strong>Session-unabhängige Daten</strong>. Bei einem News-Portal also die aktuellen Beiträge zum Beispiel. Doch die sollte man nicht jedem der Millionen von Nutzern in die Session legen. Dabei sind diese ständig gefragt, was macht man also damit? Memcache ist hier die richtige Lösung. Mit Memcache lassen sich diese nutzerunabhängigen Daten genau einmal speichern, aber für jeden Nutzer in hoher <strong>Geschwindigkeit</strong> bereitstellen. Das macht richtig Spaß.</p>
<h3>Was geht in Memcache rein?</h3>
<p>Das Beste ist: Memcache bildet nur eine simple Zuweisung von <strong>Key-Value-Paaren</strong> ab. Unter einer Zeichenkette als Schlüssel, der maximal 250 Zeichen Länge betragen darf, werden einfache Zeichenketten als Werte hinterlegt. Die Werte dürfen maximal 1 MB Größe haben. Was man darin speichert, ist tatsächlich vollkommen egal. Man kann also gezielt eine Datenbank beschleunigen oder aber auch Template-Engines entlasten, also ganze HTML-Vorlagen ablegen, vielleicht auch schon komplett mit allen Inhalten gerendert. Ebenso lassen sich die Einträge unabhängig von deren Nutzung befüllen, zum Beispiel nachts, wenn die Last der Server geringer ist. Tagsüber stehen dann z.B. aggregierte Daten zum schnellen Abruf bereit.</p>
<p>Die <strong>PHP</strong>-Schnittstelle ist dazu mit einer <strong>automatischen Serialisierung</strong> implementiert. Man kann also einfach komplexere Objekte und Arrays einfach hineinwerfen &#8211; und so kommen sie auch heraus. Einzig und allein Pointer wie Dateizeiger oder auch (Datenbank-)Verbindungen sollte man nicht hineinwerfen, denn Ressourcen können im Allgemeinen nicht richtig wiederhergestellt werden. Jeder Eintrag kann dabei on-the-fly mit zlib komprimiert werden, sollte es sich um größere Datenmengen handeln, um im 1-MB-Bereich zu bleiben oder einfach aus Speichergründen. Der Dienst <strong>memcached</strong> wird außerdem mit einer Option -m für die Gesamtspeichergröße</p>
<pre>/usr/local/bin/memcached -d -m &lt;Anzahl der MB&gt; -p 11211 -l 127.0.0.1 -u nobody</pre>
<p>gestartet, sodass bei -m 2048 maximal 2 GB des Arbeitsspeichers belegt werden. Nicht zuletzt wird beim Zwischenspeichern ein Zeitlimit gesetzt, wie lange der Cache-Eintrag gültig sein soll.</p>
<h3>Anwendung am Beispiel www.ebrosia.de</h3>
<p>Zunächst habe ich ein Profiling unserer Startseite gemacht. Die sollte wohl sehr häufig aufgerufen werden. Insgesamt bietet allein diese Seite Anlass für über 100 Datenbank-Abfragen, wenn man alles streng nimmt. Also ist das mein erstes Optimierungsgebiet gewesen. Es gibt natürlich Abfragen, die man besser nicht zwischenspeichert, wie zum Beispiel den Warenkorb des Benutzers &#8211; der sollte immer auf die Sekunde aktuell sein. Die Zusammenfassung des Warenkorbs (x Artikel mit y Gesamtpreis) wandert also am besten in die Session: Verbraucht nicht viel Platz, ist nutzerabhängig und wird bei einer Änderung am Warenkorb neu errechnet, also eher selten.</p>
<p>Bei der Entscheidung, ob ganze <strong>Templates</strong> optimiert werden sollen, habe ich mich dagegen entschieden: Die Mehrzahl der Seiten bietet für eingeloggte Nutzer individualisierte Inhalte, dazu sind die Templates nicht wirklich die Zeitfresser, da reines HTML und PHP zum Einsatz kam, also keine Layout-Engine verwendet wird. Die Seiten leben eher von den kleinen Abfragen an die Datenbank. Hier und da geht es um Links zu einem Artikel, um einen Preis, einen Artikelnamen. Speziell zu Wein kamen noch das Land, ein Gebiet oder eine Rebsorte hinzu.</p>
<p>Wenn man einen <strong>Shop</strong> betreibt, dann sind die Produktdaten das A und O, gerade bei etwa 1000 Artikeln. In fast jeder Shop-Seite, besonders auf der Startseite, kommen mehrere, auch wechselnde Artikel vor. Jeder Artikel hat einen Namen, einen Preis, einen Rabatt und eine Lieferbarkeit. Diese Daten werden eventuell mehrfach pro Sekunde abgerufen, aber vielleicht nur einmal im Monat geändert, zum Beispiel bei einer Rabatt-Aktion. Setzt man hier ein <strong>Zeitlimit</strong> von 10-20 Minuten an, sollten also geschätzte 90% der Aufrufe mit Memcache abgefangen werden, ohne dass die Aktualität leidet. Ich habe mich für ein kurzes Zeitfenster von 10 Minuten entschieden, um im Fehlerfall flexibler zu bleiben.</p>
<p>Also habe ich dort angesetzt. Memcache bildete eine Art <strong>Zwischenschicht</strong> zwischen dem <strong>Shop</strong> als Gestaltung und dem <strong>Datenbank-Backend</strong>. Letztlich konnte ich so mit nur einer kleinen Memcache-Implementierung im Backend gleich sehr viele Shop-Seiten verbessern, die auf die optimierten Funktionen mit den <strong>SQL-Abfragen</strong> zugreifen. Mit der Zwischenspeicherung von Preisen, Rabatten, Namen von Artikeln und Kategorien habe ich die Startseite auf ein durchschnittliches Volumen von etwa 5 SQL-Anfragen gedrückt. Diese Anfragen gehen auf die stetige Erneuerung von Cache-Einträgen wie auch das Rotieren von Produkten in Teasern zurück. Letztlich betrug die Zeit der Auslieferung der Startseite nur noch 35-50 Millisekunden (PHP-Start bis PHP-Ende). Seiten ohne SQL-Inhalte bewegten sich gleichen Zeitrahmen. Man konnte demnach davon ausgehen, dass das <strong>Caching</strong> die Belastung des MySQL-Servers auf ein Minimum reduziert hatte.</p>
<p>Im zweiten Schritt ging es dann an Artikel- und Kategorie-Seiten. Diese waren schon weitgehend durch den vorigen Schritt entlastet. Es waren nur noch wenige Handgriffe zu tun, um auch hier an die gleichen Rendering-Zeiten zu gelangen. In Frieden ließ ich den individuellen Konto-Bereich der Kunden. Hier wäre auch das Optimierungspotenzial geringer. Mit dem investierten Aufwand bin ich bereits weit genug gekommen für eine erste Runde.</p>
<h3>Rollout auf dem Webserver</h3>
<p>Libevent installiert und memcache kurz kompiliert, schon konnte es losgehen. Der Dienst startete angenehm einfach. Das PHP-Modul ist mit einem einfach <strong>phpize</strong>, <strong>configure</strong> und <strong>make</strong> ebenso leicht aufgesetzt. Jetzt nur noch das <strong>Modul</strong> in der <strong>php.ini</strong> fest eingetragen und nach einem kurzen Neustart des Apache sagte mir ein Testskript &#8220;Ja, es ist angerichtet.&#8221; <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Der Shop wurde synchronisiert, und schwupps, kamen erste Ergebnisse im Cache an. Das Gefühl eines schnelleren Arbeitens war wirklich omnipräsent, das fühlte sich gleich gut an. Nach einigen Stunden Laufzeit hatte Memcache eine <strong>Trefferquote</strong> von etwa 87% zu verzeichnen, und die Last auf dem DB-Server war damit drastisch gefallen. An die Optimierung weiterer Bereiche kann nun Schritt für Schritt herangegangen werden. <strong>Nagios </strong>zeichnet flachere Kurven, und der Admin ist zufrieden. Jetzt kann Weihnachten kommen. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2009/10/memcache-gib-mir-speed/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>korrektes Redirect mit 301 Moved Permanently</title>
		<link>http://www.lieber-linux.de/2009/05/korrektes-redirect-mit-301-moved-permanently/</link>
		<comments>http://www.lieber-linux.de/2009/05/korrektes-redirect-mit-301-moved-permanently/#comments</comments>
		<pubDate>Fri, 01 May 2009 10:08:48 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipp]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[301]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Redirect]]></category>
		<category><![CDATA[Rewrite]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=466</guid>
		<description><![CDATA[Da Domains von Zeit zu Zeit umziehen, ist es wichtig, einem Besucher mit der alten URL zu sagen, wohin der Inhalt gewechselt hat. Dafür sollte man nicht einfach einen Satz wie &#8220;Du findest das jetzt hier.&#8221; in die alte Seite klatschen. Das ist häßlich und benutzer-unfreundlich. Javascript-Reloads finde ich ebenso unschön, die weil nicht jeder [...]]]></description>
			<content:encoded><![CDATA[<p>Da Domains von Zeit zu Zeit umziehen, ist es wichtig, einem Besucher mit der alten URL zu sagen, wohin der Inhalt gewechselt hat. Dafür sollte man nicht einfach einen Satz wie &#8220;Du findest das jetzt <span style="text-decoration: underline;">hier</span>.&#8221; in die alte Seite klatschen. Das ist häßlich und benutzer-unfreundlich. Javascript-Reloads finde ich ebenso unschön, die weil nicht jeder <strong>Javascript</strong> hat. Und es ist auch nicht besonders erklecklich, 10 Sekunden auf einen ablaufenden Timer zu starren, weil auch langsame Leser bedacht wurden. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><span id="more-466"></span></p>
<p>Am besten führt man den Besucher also gleich an die richtige Stelle. Und dieser Mechanismus heißt <strong>Redirect</strong>. Mit einfachen Boardmitteln (entweder in der .htaccess mit <strong>mod_rewrite</strong> oder mit <strong>PHP</strong>), die man auf fast allen Webservern findet, lässt sich ein Redirect in Sekundenschnelle einbauen. Ich vergesse auch immer wieder, wie man einen korrekten Redirect setzt. Und dann stückele ich mir das zusammen. Deswegen hier ein <strong>PHP-Script</strong> zur Zusammenfassung:</p>
<pre>&lt;?php
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: http://www.neue-domain.de/");
   header("Connection: close");
   exit();
?&gt;</pre>
<p>Gut ist es, den Redirect mit Status 301 (permanent) zu setzen, ein 302 (temporär) könnte bei Suchmaschinen schnell nach hinten los gehen. Das PHP-Schnippselchen wird einfach an den Anfang der alten Webseite gesetzt. Wichtig: Davor darf wirklich gar nichts über den Äther gegangen sein. Auch keine Leerzeilen &#8211; sonst greifen die HTTP-Header-Angaben nicht.</p>
<h3>301 Redirect in der .htaccess</h3>
<p>Ein anderer Mechanismus nutzt die Fähigkeiten des Webservers. Für einen Apache-Webserver macht man einen Verweis über einen Eintrag in der Datei <strong>.htaccess</strong> im Document-Root-Verzeichnis der alten Domain. Dort gibt man dem <strong>Rewrite</strong>-Modul eine Regel (RewriteRule) mit, welche aus der alten URL eine neue schreibt:</p>
<pre>&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ http://www.neue-domain.de/$1 [R=301,L]
&lt;/IfModule&gt;</pre>
<p>Zuerst der linke Teil: Die Regel <strong>^(.*)$</strong> bedeutet: Alle angesprochenen Unterseiten <strong>.*</strong> zwischen Anfang <strong>^</strong> und Ende <strong>$</strong> sollen der neuen Domain übergeben werden. Deswegen die Klammer darum. So kann im zweiten Teil der Regel mit <strong>$1</strong> auf die erste Klammer der linken Regel Bezug genommen werden. Dadurch wird zum Beispiel aus <em>http://www.alte-domain.de/start.php</em> ein Verweis auf <em>http://www.neue-domain.de/start.php</em>.</p>
<p>Der Schalter <strong>[R=301]</strong> setzt wieder den Permantenten Redirect (das verstehen die Suchmaschinen und ändern ihre Einträge). Dabei signalisiert <strong>[L]</strong>, das es sich bitte um die letzte anzuwendende Regel handelt, danach soll Apache bitte mit Rewriting aufhören. Meistens ist er brav und tut das dann auch. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2009/05/korrektes-redirect-mit-301-moved-permanently/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Über die Tracking-Falle springen</title>
		<link>http://www.lieber-linux.de/2009/02/ueber-die-tracking-falle-springen/</link>
		<comments>http://www.lieber-linux.de/2009/02/ueber-die-tracking-falle-springen/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 21:40:56 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tipp]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Datenschutz]]></category>
		<category><![CDATA[etracker]]></category>
		<category><![CDATA[Firewall]]></category>
		<category><![CDATA[google analytics]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[Tracking]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=281</guid>
		<description><![CDATA[Ein kleiner Tipp am Rande: Viele Linux-Benutzer haben ja auch einen Apache laufen, sei es nur zum Spaß, oder um die eigene Website auch offline weiterentwickeln zu können. Dies kann man sehr schön nutzen, um andere Webseiten das Ausspionieren des eigenen Verhaltens etwas zu erschweren. Denn viele Seiten benutzen google-analytics oder etracker, um das maximal [...]]]></description>
			<content:encoded><![CDATA[<p>Ein kleiner Tipp am Rande: Viele Linux-Benutzer haben ja auch einen <strong>Apache</strong> laufen, sei es nur zum Spaß, oder um die eigene Website auch offline weiterentwickeln zu können. Dies kann man sehr schön nutzen, um andere Webseiten das Ausspionieren des eigenen Verhaltens etwas zu erschweren.</p>
<p><span id="more-281"></span>Denn viele Seiten benutzen <strong>google-analytics</strong> oder <strong>etracker</strong>, um das maximal Messbare aus ihren Nutzern herauszupressen. Wer Lust hat, mitzumachen, bitteschön. Wer nicht, kann durch ein paar simple Zeilen in der Datei <em>/etc/hosts</em> sein Leben als Surfer etwas ruhiger gestalten. Dazu trägt man einfach die nicht erwünschten Servernamen mit lokalen Adressen ein, hier ein Beispiel:</p>
<pre>127.0.0.101Â Â Â Â Â Â Â  www.etracker.de
127.0.0.102        www.etracker.com</pre>
<p>Ein ganz globaler Vorteil: Das Laden dieser Seiten geht nun wesentlich schneller.</p>
<p>Jetzt höre ich schon wieder Stimmen in meinem Kopf, die rufen: <em>Warum denn per Hand? Gibts das nicht als Browser-Plugin (wie ein Ad-Blocker), oder als Gnome-Widget? Oder als Kommandozeilen-Tool? Warum schon wieder selber was machen?</em> Nun, dass zwei Zeilen die wohl allerallerkürzeste Variante sind, das sei wohl hiermit bewiesen. Aber es gibt ganz praktische Gründe für diese Lösung.</p>
<p>Ein Vorteil gegenüber <strong>iptables</strong> (dem Firewall-Mechanismus von Linux) ist, dass unser Rechner immer einen <strong>404-Fehler</strong> meldet, solltet Ihr nicht wahnwitzig genug sein, den <strong>etracker</strong> nachzubasteln. Der Browser bekommt also, was er möchte, nämlich eine Antwort, egal welcher Art. Würde man eine Adresse per <strong>iptables</strong> eliminieren (-j DROP), so bliebe der Browser im Zweifelsfalle hängen.</p>
<p>Vorteil gegenüber einer Browser-integrierten Option ist, dass dies gleich für alle anderen Browser, Newsreader oder Email-Clients ebenso funktioniert. Und&#8230;ich könnte jetzt noch die übermittelten Daten aus dem <strong>Apache</strong>-Log aggregieren: Was will eine Seite über mein Verhalten wissen? Man könnte dann auch mal die Webmaster der Server fragen, warum sie sich so Daten-krakig verhalten und Ihnen die Logs gleich mitschicken.</p>
<p>Einziger Nachteil: Man muss <strong>root</strong> sein &#8211; aber das ist ja nun fast jeder&#8230; <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2009/02/ueber-die-tracking-falle-springen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>World Wide Web 2.0</title>
		<link>http://www.lieber-linux.de/2007/09/world-wide-web-20/</link>
		<comments>http://www.lieber-linux.de/2007/09/world-wide-web-20/#comments</comments>
		<pubDate>Fri, 07 Sep 2007 12:19:22 +0000</pubDate>
		<dc:creator>Nudge</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Intranet]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.lieber-linux.de/?p=14</guid>
		<description><![CDATA[Also ich bin ja bekannt dafür, nicht viel von Web 2.0 zu halten. Umso erstaunlicher, dass ich selbst seit einigen Tagen an einer Web 2.0 Seite im Intranet unserer Firma bastle. Und ich muss zugeben, Web 2.0 hat etwas. Am erfreulichsten fand ich die Tatsache, dass man keinen Installationsaufwand hat. Man braucht weder Servlet-Container, Apache-Module [...]]]></description>
			<content:encoded><![CDATA[<p>Also ich bin ja bekannt dafür,  nicht viel von Web 2.0 zu halten.</p>
<p>Umso erstaunlicher, dass ich selbst seit einigen Tagen an einer Web 2.0 Seite im Intranet unserer Firma bastle. Und ich muss zugeben, Web 2.0 hat etwas.</p>
<p><span id="more-14"></span></p>
<p>Am erfreulichsten fand ich die Tatsache, dass man keinen Installationsaufwand hat. Man braucht weder Servlet-Container, Apache-Module noch irgendwelche anderen Erweiterungen auf dem Server, sondern alles läuft auf der Programmier-Ebene ab. Zumindest die technische Seite von Web 2.0 kann auf folgenden Satz reduzieren: Man instanziiert eine Javascript-Klasse namens XMLHttpRequest, führt über die Methoden open() und send() einen asynchronen Request aus und verarbeitet dessen Response auf der bestehenden Seite. That&#8217;s it.</p>
<p>Klar, neben dem Request ist vor allem der JS-Code das schwierigste, um den per Response erhaltenen Content ordentlich auf der bestehenden Seite einzubauen. Hier bin ich bisher komplett ohne XML oder XSLT gefahren (also AJ statt AJAX), habe den Response in Stino-HTML erzeugt und einfach in ein dafür angelegtes Seiten-Element als innerHTML reingeworfen. Im Response eingebaut war dann auch schon der Code, um diesen per JS-Aufrufe weiter an andere Elemente zu verteilen. Mit etwas Nachdenken kann man hier mit ein, zwei Übergabeparametern (Element-ID&#8217;s, Präfixe) wunderbar generisch arbeiten, so dass sowohl die erstellte Request-Technologie als auch der Management-Code ausgelagert und für mehr als nur eine Seite nutzbar gemacht werden können.</p>
<p>Man kann also ganz klein und leicht beginnen, sich ein paar generische Abfragen und eine JS-Skript-Datei erstellen und schon hat man neue, interessante Werkzeuge, die man sogar noch ganz leicht in bestehende Seiten einbauen kann. Damit das ganze flüssig läuft, habe ich die Indizes unserer Tabellen auf die Abfragen hin ergänzt. Der Faktor der Beschleunigung betrug etwa 2 bis 3! Die schnellen Abfragen ohne JOIN machen dann auch richtig Spaß &#8211; es flutscht einfach mal. <img src='http://www.lieber-linux.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Der einizige Nachteil ist natürlich: Der Anwender braucht Javascript! Und der Browser muss auch noch der Site vertrauen. IE7-Nutzer müssen die Seite also evtl. explizit eintragen. Daneben braucht der Nutzer evtl. noch Session-Cookies, damit man mit PHP auch noch die Ergebnise bequem weiterverarbeiten kann, ohne sich die Finger wund zu coden. Im firmeneigenen Intranet ist das alles weniger kritisch, hier kann man die Anforderungen selbst abschätzen/austesten, definieren und für alle verbindlich umsetzen.</p>
<p>Als nächstes gehts weiter mit der Praxistauglichkeit. Wie skaliert das ganze, wenn es auf einem stark frequentiertem Server läuft? Wie stark sind die Latenzen des Netzes? Sollte sich herausstellen, dass flüssiges Arbeiten möglich ist, eröffneten sich uns dadurch ganz neue Möglichkeiten, vor allem bei der Einbindung externer Partner.</p>
<p>Also schnell weiter machen&#8230;Tschüß!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lieber-linux.de/2007/09/world-wide-web-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

