<?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>PHP Gangsta - Der PHP Blog mit Praxisbezug &#187; wordpress</title> <atom:link href="http://www.phpgangsta.de/tag/wordpress/feed" rel="self" type="application/rss+xml" /><link>http://www.phpgangsta.de</link> <description>Ein PHP Blog mit Themen aller Art. Manchmal vergewaltige ich PHP...</description> <lastBuildDate>Thu, 02 Feb 2012 22:22:51 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>High Performance: Caching (reloaded) mit PHP</title><link>http://www.phpgangsta.de/high-performance-caching-reloaded-mit-php</link> <comments>http://www.phpgangsta.de/high-performance-caching-reloaded-mit-php#comments</comments> <pubDate>Mon, 19 Dec 2011 08:46:52 +0000</pubDate> <dc:creator>Oliver</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[APC]]></category> <category><![CDATA[Cache]]></category> <category><![CDATA[Caching]]></category> <category><![CDATA[Cherokee]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4062</guid> <description><![CDATA[Gastartikel von Oliver Sperke. Ich bin 35 Jahre alt und seit 10 Jahren selbständiger Webentwickler. Mein Fokus liegt dabei auf der Erstellung, Beratung und Optimierung in den Bereichen High Performance, Usability und Sicherheit in den gängigsten Internetsprachen: PHP, HTML, Javascript und CSS. Nach langem Arbeiten an einem Projekt fängt der ambitionierte Entwickler an, zu testen, [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/php-in_array-die-performance-bremse' rel='bookmark' title='PHP in_array() die Performance-Bremse'>PHP in_array() die Performance-Bremse</a></li></ol>]]></description> <content:encoded><![CDATA[<p><em>Gastartikel von Oliver Sperke.</em></p><p><em>Ich bin 35 Jahre alt und seit 10 Jahren selbständiger Webentwickler. Mein Fokus liegt dabei auf der Erstellung, Beratung und Optimierung in den Bereichen High Performance, Usability und Sicherheit in den gängigsten Internetsprachen: PHP, HTML, Javascript und CSS.</em></p><p>Nach langem Arbeiten an einem Projekt fängt der ambitionierte Entwickler an, zu testen, wie sich seine dynamische Internetseite unter Last verhält. Da ja jeder von uns von Millionen Besuchern träumt, will man natürlich auch wissen, wie sich Millionen von Besucher anfühlen und ob unser „kleines Kunstwerk“ davon genau so begeistert wäre wie wir. Dynamische Webseiten sind toll, allerdings hat der gemeine Internetserver ein großes Problem damit. Die Erzeugung ist meist sehr aufwendig. Daten müssen aus Datenbanken geholt werden, Berechnungen wollen berechnet werden und Blogeinträge müssen wie Blogeinträge aussehen.</p><p>Seit Jahren hat sich eine simple Technik etabliert, die diese gequälten Webserver entlastet. Jeder fortgeschrittene Entwickler kennt und liebt sie, weil sie so schön einfach und universal einsetzbar ist: <em>*trommelwirbel*</em> <strong><a href="http://de.wikipedia.org/wiki/Cache" target="_blank">Das Caching</a></strong> <em>*tusch*</em>. Da aber Caching an sich ein uralter Hut ist, will ich Euch zeigen, wie Ihr evtl. Eure Performance mit minimalen Änderungen mehr als verdoppeln könnt.</p><h2>Am Anfang war der Benchmark</h2><p><span id="more-4062"></span>Nehmen wir als Beispiel eine ganz normale <a href="http://wordpress.org/" target="_blank">WordPress</a> Installation mit dem <a href="http://wordpress.org/extend/plugins/demo-data-creator/" target="_blank">üblichem Inhalt</a>. WordPress ist umfangreich, es ist komfortabel, es ist leicht verständlich und es ist langsam. Da aber in den wenigstens Blogs sekündlich neue Beiträge und/oder Kommentare geschrieben werden, dafür aber häufige Aufrufe nicht unüblich sind, drängt sich uns hier das Caching geradezu auf. Natürlich gibt es <a href="http://wordpress.org/extend/plugins/w3-total-cache/" target="_blank">einige</a> <a href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">gute</a> <a href="http://wordpress.org/extend/plugins/cachify/" target="_blank">Plugins</a> dafür, die die verschiedenen Möglichkeiten des Cachings wunderbar abdecken. Aber um die soll es heute zur Abwechslung einmal nicht gehen. Ich will Euch ja nicht mit den „ollen Kamellen“ langweilen.</p><p>Um die Geschwindigkeit zu testen brauchen wir natürlich Hilfe in Form eines wunderbaren Programm Namens <a href="http://httpd.apache.org/docs/2.0/programs/ab.html" target="_blank">Apachebench</a>. Dieses ist ein sehr einfach gehaltenes, aber mächtiges Kommandozeilenprogramm. Es macht im Prinzip nichts anderes als eine vorgegebene Seite immer wieder und wieder abzurufen. Dabei merkt es sich Start und Endzeitpunkt und berechnet daraus die Geschwindigkeit, mit der unsere Anfragen beantwortet wurden. Da wir immer noch mit dynamischen Daten arbeiten, starten wir einen ersten vorsichtigen Test. Wir rufen die index.php unserer WordPress Installation zunächst 1000 Mal (-n1000) auf mit je 4 parallelen Zugriffen (-c4). Ich habe 4 gewählt, weil mein Testsystem vier Prozessorkerne hat. So ist ständig jeder Prozessorkern beschäftigt. Die gesamten Daten des Testsystems findet Ihr am Ende des Artikels. Ich gebe bei der Ausgabe von Apachebench immer nur die wichtigen Daten an. Die gesamte Ausgabe ist natürlich umfangreicher.</p><pre class="brush: bash; title: ; notranslate">
ab -n1000 -c4 http://phpgangsta.x-blogs.org/
</pre><pre class="brush: plain; light: true; title: ; notranslate">
Server Software:        Cherokee
Server Hostname:        phpgangsta.x-blogs.org
Server Port:            80

Document Path:          /
Document Length:        18612 bytes

Concurrency Level:      4
Time taken for tests:   16.623 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      18990000 bytes
HTML transferred:       18612000 bytes
Requests per second:    60.16 [#/sec] (mean)
Time per request:       66.490 [ms] (mean)
Time per request:       16.623 [ms] (mean, across all concurrent requests)
Transfer rate:          1115.65 [Kbytes/sec] received
</pre><p>Was soll man da sagen? Glückwunsch, es <em>ist</em> langsam!</p><h2>Machen wir es schneller</h2><p>Wie es schon zu erwarten war, kommen wir mit unserem Standard WordPress nicht weit. Neben der lausigen Geschwindigkeit von 60 Zugriffen pro Sekunde waren während des gesamten Tests auch alle Prozessorkerne bis zum Anschlag ausgelastet. So macht also Bloggen für Millionen Leser keinen Spaß. Einfachste Lösungmöglichkeit &#8211; wir besorgen uns eines der o. g. Plugins, doch da lernen wir ja nichts draus, richtig? Wir wollen selber cachen und ausserdem können wir das bestimmt auch viel besser.</p><p>Als <a href="http://de.wikipedia.org/wiki/Persistenz_%28Informatik%29" target="_blank">persistenten</a> Speicher nehme ich <a href="http://pecl.php.net/package/apc" target="_blank">APC</a>. Dieses Zusatzmodul ist auf vielen PHP Webservern schon installiert, denn die Hauptaufgabe von APC ist es, PHP Code zu kompiliert und diesen im Arbeitsspeicher zu halten. So werden unsere PHP Scripte <a href="http://2bits.com/articles/benchmarking-apc-vs-eaccelerator-using-drupal.html" target="_blank">dramatisch beschleunigt</a>. Alternativ funktionieren natürlich auch Memcache, alle Datenbanken oder einfache Dateien, in denen wir unsere Daten ablegen. Jede Variante hat seine Vor- und Nachteile. Memcache ist immer dann interessant, wenn man Daten auf mehrere Server verteilen muss, genau so wie Datenbanken, die aber überdimensioniert sind und einen hohen <a href="http://de.wikipedia.org/wiki/Overhead_%28EDV%29" target="_blank">Overhead</a> erzeugen. Dateien funktionieren auch ohne zusätzliche Installationen, sind aber recht langsam. APC ist von den genannten die schnellste Methode.</p><p>Da wir hier kein WordPress-Tutorial, sondern ein Performancetutorial machen, tun wir genau das, was man niemals tun sollte. Wir schreiben der Einfachheit halber in die Kerndateien von WordPress, in diesem Fall die index.php. Diese drängt sich geradezu auf, beschleunigt zu werden. Meine Modifizierung ist sehr einfach und stellt quasi ein Modell eines sehr sehr einfachen Caching dar. Keine Funktion, keine Klassen, Caching pur. Für die Praxis ist es damit natürlich nur eingeschränkt tauglich, denn es berücksichtigt ja in keinster Weise Änderungen durch neuen Beiträge oder Kommentare und unterscheidet auch nicht, ob ein Benutzer eingeloggt ist oder nicht. Das ganze System müsste um diese Abhängigkeiten erweitert werden. Trotzdem eignet es sich aber als Basis für Eure eigenen Experimente.</p><pre class="brush: php; title: ; notranslate">
// CacheID
// Der Cache wird neu erstellt durch Änderung der vorstehenden Variable
$cacheid = 'cache' . md5($_SERVER['REQUEST_URI']);

// Sind Daten vorhanden?
if(apc_exists($cacheid) != false)
{
	// dann hole sie und zeige Sie auf der Seite und beende den Vorgang
	$output = apc_fetch($cacheid);
	echo $output;
	exit;
}

// Wir benötigen einen Ausgabepuffer
ob_start();

/** Loads the WordPress Environment and Template */
require('./wp-blog-header.php');

// Wir fangen die Ausgabe ab ...
$output = ob_get_contents();

// ... und vertrauen diese APC an
apc_store($cacheid, $output, 300);
</pre><p>Wiederholen wir den Test von oben. Die Performance sollte sich jetzt wesentlich verbessert haben. Die Daten werden einmal erzeugt und dann in den gemeinsamen Speicher von APC abgelegt. Weitere Aufrufe geben nur noch den Inhaltes des Caches wieder. Testen wir also noch einmal. Ab hier erhöhe ich die Anzahl der Abfragen (-n) auf 100.000, weil damit aussagekräftigere Werte entstehen.</p><pre class="brush: bash; title: ; notranslate">
ab -n100000 -c4 http://phpgangsta.x-blogs.org/
</pre><pre class="brush: plain; light: true; title: ; notranslate">
Concurrency Level:      4
Time taken for tests:   19.911 seconds
Complete requests:      100000
Requests per second:    5022.40 [#/sec] (mean)
Time per request:       0.796 [ms] (mean)
Time per request:       0.199 [ms] (mean, across all concurrent requests)
</pre><p>Okay, klarer Fall von Makro-Optimierung!</p><h2>Machen wir es noch schneller</h2><p>Bis hier hin dürften die meisten von uns schon einmal gekommen sein. Wir haben also die Geschwindigkeit unseres kleinen Blogs mit einfachsten Mitteln um den Faktor ~80 beschleunigt und könnten also Feierabend machen. Tun wir aber nicht, denn ein anderes großes Problem haben wir nämlich noch gar nicht bedacht. Eine Seite schnell zu generieren heißt nicht, dass sie auch schnell bei unserem Besucher ankommt. Dazu kommen noch mehr Faktoren. Eine der wichtigsten ist die <a href="http://de.wikipedia.org/wiki/Datenkompression" target="_blank">Komprimierung</a> des Textes vor der Ausgabe.</p><p>Wie man im ersten Test schon sah, ist unsere Startseite ungefähr 18 kb groß. Über GPRS oder unser gutes altes Kabelmodem wäre diese Seite satte 3 bis 4 Sekunden unterwegs. Das ist definitiv so lang, dass ein Benutzer genervt wegschalten könnte. Wenn wir Millionen Besucher haben möchten, dürfen wir aber auf dem Weg niemanden verlieren. Text-, bzw. html-Dateien sind gerade zu dafür erfunden worden, <a href="http://phpperformance.de/ob_gzhandler-vs-zlib-output_compression/" target="_blank">vor dem Versand komprimiert zu werden</a>. Die Trafficersparnis beträgt meistens über 80%, da sich wiederholende Zeichen leicht zusammengepackt lassen. In PHP ist diese Funktion durch den <a href="http://php.net/manual/de/function.ob-gzhandler.php" target="_blank">ob_gzhandler</a> auch sehr einfach umzusetzen. Also zurück zu unserer index.php und eine Zeile hinzufügen.</p><pre class="brush: php; title: ; notranslate">
// Sind Daten vorhanden?
if(apc_exists($cacheid) != false)
{
	// Seiten vor der Ausgabe packen
	ob_start(&quot;ob_gzhandler&quot;);

	// dann hole sie und zeige Sie auf der Seite und beende den Vorgang
	$output = apc_fetch($cacheid);
	echo $output;
	exit;
}
</pre><p>Da Apachebench in der Standardkonfiguration dem Webserver nicht mitteilt, dass es auch mit der gepackten Version arbeiten kann, müssen wir unsere Befehlszeile etwas modifizieren. Mit dem Parameter -H können wir der abgefragten Internetseite zusätzliche Kopfdaten schicken und damit sagen, dass wir auch GZip sprechen und daher doch lieber das kleine Päckchen nehmen. Damit imitieren wir das Verhalten von richtigen Browsern. Diese sagen einer Internetseite mit jedem Aufruf, „Hallo, ich kann auch GZip“. Der ob_gzhandler erkennt dies und packt unsere Daten im Ausgabepuffer vor dem Versand. Die Größe der Datei sinkt &#8211; die Übertragung wird schneller. Doch was ist mit unserer Serverperformance?</p><pre class="brush: bash; title: ; notranslate">
ab -n 100000 -c 4 -H &quot;Accept-Encoding: GZip&quot; http://phpgangsta.x-blogs.org/
</pre><pre class="brush: plain; light: true; title: ; notranslate">
Document Length:        4844 bytes

Concurrency Level:      4
Time taken for tests:   41.272 seconds
Requests per second:    2422.94 [#/sec] (mean)
Time per request:       1.651 [ms] (mean)
Time per request:       0.413 [ms] (mean, across all concurrent requests)
</pre><p>Ein Testergebnis mit 8 Buchstaben: <span style="text-decoration: line-through;">Resultat</span> Verdammt! Positiv fällt uns natürlich sofort auf, dass die Seite auf ca. ein Viertel geschrumpft ist. Statt 3 bis 4 Sekunden würde ein Besucher mit kleiner Leitung nur noch weniger als 1 Sekunde warten. Eine wesentliche Verbesserung und kaum eine Chance, den Browser zu schliessen. Nur unsere wunderbare Performance hat sich dabei halbiert. Nichts mehr mit Millionen Besuchern, Frauen (oder Männern), Geld, Ruhm und noch mehr Frauen (oder Männern).</p><h2>Die Reihenfolge macht&#8217;s</h2><p>Preisfrage: Was würde passieren, wenn wir nicht die Ausgabe speichern und dann komprimieren, sondern erst komprimieren und dann speichern? An die Editoren! Zunächst einmal brauchen wir eine Funktion, die uns aus einer Textdatei eine GZip Datei macht. Mit der Funktion <a href="http://de3.php.net/manual/de/function.gzencode.php" target="_blank">gzencode</a> ist dies problemlos möglich. Unsere Datei muss dazu nur minimal geändert werden. Wir komprimieren die Ausgabe vor der Speicherung auf dem höchsten Faktor 9. Die Datei soll möglichst klein werden.</p><pre class="brush: php; title: ; notranslate">
// und vertrauen diese APC an
apc_store($cacheid, gzencode($output, 9), 300);
</pre><p>Fehlt uns noch die Ausgabe. Diese bleibt an sich gleich, allerdings ersetzen wir unseren ob_gzhandler gegen den Content-Encoding header, den der Browser benötigt, um GZip Daten zu erkennen und entsprechend zu interpretieren. Ohne diese „Markierung“ würde er uns die Datei einfach im Fenster angezeigt werden, was bei komprimierten Dateien, sagen wir mal, schwierig zu lesen wäre. Wir wollen ja, dass unsere Millionen Leser auch wieder kommen. Denkt bitte auch daran die CacheID zu ändern oder 5 Minuten zu warten, sonst wird der alte Inhalt des Caches ausgegeben.</p><pre class="brush: php; title: ; notranslate">
if(apc_exists($cacheid) != false)
{
	header('Content-Encoding: GZip');
	$output = apc_fetch($cacheid);
	echo $output;
	exit;
}
ob_start();
</pre><p><a href="http://schroepl.net/projekte/mod_gzip/browser.htm" target="_blank">Alle Browser in freier Wildbahn</a> unterstützen übrigens GZip-komprimierte Daten. Daher sollten auch standardmässig immer gepackte Daten ausgegeben werden. Für die wenigen Ausnahmen, bei denen dem nicht so ist, kann man folgenden Code verwenden. Dies erhöht zwar grundsätzlich die Serverauslastung, aber wie bereits erwähnt, dass ist die absolute Ausnahme.</p><pre class="brush: php; title: ; notranslate">
if(!isset($_SERVER[&quot;HTTP_ACCEPT_ENCODING&quot;]) || strpos($_SERVER[&quot;HTTP_ACCEPT_ENCODING&quot;], 'gzip') === false)
{
	echo gzdecode($output);
	exit;
}
</pre><p>Unsere Daten werden nun komprimiert gespeichert und dann ohne weitere Bearbeitung, aber mit dem richtigen Kopfdaten an den Browser gereicht. Die Frage ist, wie verhält sich unser kleines Blog jetzt? Probieren wir es aus!</p><pre class="brush: plain; light: true; title: ; notranslate">
Concurrency Level:      4
Time taken for tests:   17.424 seconds
Complete requests:      100000
Requests per second:    5739.37 [#/sec] (mean)
Time per request:       0.697 [ms] (mean)
Time per request:       0.174 [ms] (mean, across all concurrent requests)
</pre><pre class="brush: plain; light: true; title: ; notranslate">
Concurrency Level:      10
Time taken for tests:   16.773 seconds
Complete requests:      100000
Requests per second:    5961.95 [#/sec] (mean)
Time per request:       1.677 [ms] (mean)
Time per request:       0.168 [ms] (mean, across all concurrent requests)
</pre><pre class="brush: plain; light: true; title: ; notranslate">
Concurrency Level:      100
Time taken for tests:   19.683 seconds
Complete requests:      100000
Requests per second:    5080.58 [#/sec] (mean)
Time per request:       19.683 [ms] (mean)
Time per request:       0.197 [ms] (mean, across all concurrent requests)
</pre><pre class="brush: plain; light: true; title: ; notranslate">
Concurrency Level:      1000
Time taken for tests:   24.064 seconds
Complete requests:      100000
Requests per second:    4155.55 [#/sec] (mean)
Time per request:       240.642 [ms] (mean)
Time per request:       0.241 [ms] (mean, across all concurrent requests)
</pre><pre class="brush: plain; light: true; title: ; notranslate">
Concurrency Level:      2000
Time taken for tests:   33.335 seconds
Complete requests:      100000
Requests per second:    2999.87 [#/sec] (mean)
Time per request:       666.696 [ms] (mean)
Time per request:       0.333 [ms] (mean, across all concurrent requests)
</pre><p>Wie man sieht, liegen die Anfragen pro Sekunde bei 2000 (!) parallelen Abfragen immer noch 20% über denen unserer ob_gzhandler Version. Im Normalbereich ca. 10 bis 20 % über denen ohne Komprimierung. Der Prozessor ist dabei übrigens noch weit weg von Totalauslastung. Dieses Verhalten ist auch vollkommen logisch. Kleineren Daten werden wesentlich schneller abgearbeitet. Sie werden schneller aus dem shared memory gelesen und verstopfen nicht unsere Netzwerkverbindung. Auch bei unrealistisch vielen parallelen Anfragen bricht die Performance messbar, aber nicht spürbar ein.</p><h2>Fazit</h2><p>Caching ist eine lohnenswerte Technik. Caching von komprimierten Daten ist eine noch viel lohnenswertere(re) Technik, vor allem im High Performancebereich oder auf Webservern, die eigentlich unterdimensioniert sind. Wenn Ihr diese Möglichkeit habt, nutzt sie und baut es in Euer bestehendes System ein.</p><h2>Testsystem</h2><pre class="brush: plain; light: true; title: ; notranslate">
Hardware:
- Intel Quad Core i5 CPU 750  @ 2.67GHz
- 6 GB Ram
- Software Raid 1

Software:
- Debian 6.0.3
- Cherokee Web Server 1.2.101
- PHP 5.3.8 (php-fpm)
- APC 3.1.9
</pre><br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/php-in_array-die-performance-bremse' rel='bookmark' title='PHP in_array() die Performance-Bremse'>PHP in_array() die Performance-Bremse</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/high-performance-caching-reloaded-mit-php/feed</wfw:commentRss> <slash:comments>33</slash:comments> </item> <item><title>Kleinere Änderungen/Erweiterungen im Blog</title><link>http://www.phpgangsta.de/kleinere-anderungenerweiterungen-im-blog</link> <comments>http://www.phpgangsta.de/kleinere-anderungenerweiterungen-im-blog#comments</comments> <pubDate>Sun, 30 Oct 2011 13:04:42 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[Privates]]></category> <category><![CDATA[Addons]]></category> <category><![CDATA[Google Plus]]></category> <category><![CDATA[plugins]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3839</guid> <description><![CDATA[Letzten Donnerstag Abend habe ich mich mal wieder etwas um meine WordPress-Plugins gekümmert. Zwei wollten upgedated werden, eins habe ich ersetzt und auch ein neues installiert. Das neue Plugin Smart Archives Reloaded erstellt eine coole Archiv-Seite, auf der alle Artikel nach Jahren und Monaten sortiert aufgelistet sind, und man so schnell die Artikel eines bestimmten [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/blog-url-struktur-geandert' rel='bookmark' title='Blog URL Struktur geändert'>Blog URL Struktur geändert</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Letzten Donnerstag Abend habe ich mich mal wieder etwas um meine WordPress-Plugins gekümmert. Zwei wollten upgedated werden, eins habe ich ersetzt und auch ein neues installiert.</p><p>Das neue Plugin <a href="http://wordpress.org/extend/plugins/smart-archives-reloaded/" target="_blank">Smart Archives Reloaded</a> erstellt eine <a href="http://www.phpgangsta.de/archiv" target="_blank">coole Archiv-Seite</a>, auf der alle Artikel nach Jahren und Monaten sortiert aufgelistet sind, und man so schnell die Artikel eines bestimmten Zeitraums finden kann. Es gibt vier Einstellungsmöglichkeiten bei der Präsentation der Liste, ich habe die Javascript-Variante genommen damit die Liste nicht so ewig lang wird, und sie ist auch die coolste von allen <img src='http://www.phpgangsta.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><p>Das Plugin Subscribe To Comments habe ich ausgetauscht gegen das neuere <a href="http://wordpress.org/extend/plugins/subscribe-to-comments-reloaded/" target="_blank">Subscribe To Comments Reloaded</a>. Endlich ist es möglich ein Double-Opt-In Verfahren zu aktivieren, und auch das Management-Werkzeug im Admin-Bereich ist viel cooler, man kann viel mehr Dinge einstellen, Texte ändern und auch die Abonnements administrieren. Für die Benutzer gibt es nun die Möglichkeit sich benachrichtigen zu lassen ohne einen Kommentar hinterlassen zu müssen, finde ich auch super. Des weiteren ist die <a href="http://www.phpgangsta.de/comment-subscriptions" target="_blank">Administrierbarkeit des Benutzers</a> schöner geworden.</p><p><span id="more-3839"></span>Das Plugin <a href="http://wordpress.org/extend/plugins/2-click-socialmedia-buttons/" target="_blank">2 Click Social Media Buttons</a> ist in Version 0.12 erschienen, und nun ist auch Flattr durch den 2-Klick-Schutz abgesichert, es sieht also einheitlich aus. Ich hadere noch etwas mit mir ob ich rechts in der Leiste den Flattr-Link rausnehmen sollte oder nicht, eigentlich müßte ich daraus konsequenterweise auch eine 2-Klick-Variante machen, aber mir fehlt die Lust <img src='http://www.phpgangsta.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><p>Da mich einige bei <a href="https://plus.google.com/u/0/106574263329524155549" target="_blank">Google Plus</a> nicht gefunden haben habe ich den Link in die rechte Leiste gepackt.</p><p>Da die WordPress-Plugin-Datenbank so riesig ist kann man unmöglich alle kennen, falls ihr gute Plugins kennt, selbst einsetzt oder mir empfehlt, immer her mit den Infos!</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/blog-url-struktur-geandert' rel='bookmark' title='Blog URL Struktur geändert'>Blog URL Struktur geändert</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/kleinere-anderungenerweiterungen-im-blog/feed</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Blog URL Struktur geändert</title><link>http://www.phpgangsta.de/blog-url-struktur-geandert</link> <comments>http://www.phpgangsta.de/blog-url-struktur-geandert#comments</comments> <pubDate>Sun, 29 Nov 2009 00:36:15 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[htaccess]]></category> <category><![CDATA[redirect]]></category> <category><![CDATA[SEO]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=641</guid> <description><![CDATA[So, nun habe ich etwas Zeit gehabt und auf die suchmaschinenfreundliche URL-Struktur umgestellt. Vorher hatte ich umgestellt auf /%post_id% , sodass Artikel unter http://www.phpgangsta.de/630 verfügbar waren. Das war primär dafür gemacht, dass ich diese kurzen URLs in Twitter nutzen kann, da ich Short-URL-Dienste hasse (man weiß nie was dahinter versteckt ist). Nun habe ich die [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p>So, nun habe ich etwas Zeit gehabt und auf die suchmaschinenfreundliche URL-Struktur umgestellt. Vorher hatte ich umgestellt auf /%post_id% , sodass Artikel unter</p><p>http://www.phpgangsta.de/630</p><p>verfügbar waren. Das war primär dafür gemacht, dass ich diese kurzen URLs in Twitter nutzen kann, da ich Short-URL-Dienste hasse (man weiß nie was dahinter versteckt ist).</p><p>Nun habe ich die Struktur umgestellt auf /%postname% , sodass der selbe Artikel nun standardmäßig so verlinkt ist:</p><p>http://www.phpgangsta.de/taugt-zend_queue-etwas</p><p>ABER: Da ich die kurzen URLs nicht verlieren wollte (und die Links in Google/Twitter weiterhin funktionieren sollen) habe ich meine .htaccess noch angepasst, sodass ich nun beide Formate nutzen kann. In Twitter kann ich also weiterhin meine geliebten Kurz-URLs nutzen, im Blog wird allerdings der Postname genutzt. Meine .htaccess sieht nun so aus:</p><pre class="brush: plain; title: ; notranslate">&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /

RewriteRule ^([0-9]+)$ /?p=$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
&lt;/IfModule&gt;</pre><p>Falls also in der URL nur Zahlen vorkommen, sende ich einen &#8220;301 Permanent Redirect&#8221; auf die URL ?p=&lt;id&gt; , diese URL wandelt WordPress dann nochmals um und leitet auf die URL mit dem Postnamen um. In Google sollten nun also bald die Artikel nur noch mit dem Postnamen erscheinen und die ID-URLs bald verschwinden. Ich bin gespannt, ob das so klappt.</p><p>Um nur einen 301 Redirect zu nutzen hätte ich ein kleines Script schreiben müssen, welches aus einer ID die Postname-URL herausfindet (Datenbank?) und dann redirected. Ob das einfach ist und vor allem bei zukünftigen WordPress-Updates noch funktioniert würde ich bezweifeln, und soweit ich weiß sind 2 Redirects kein Problem, oder hat jemand andere Informationen?</p><p>Jedenfalls funktioniert es nun so wie ich möchte, und Google werde ich in den nächsten Tagen mal beobachten.</p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/blog-url-struktur-geandert/feed</wfw:commentRss> <slash:comments>19</slash:comments> </item> <item><title>Optimierung meines Blogs</title><link>http://www.phpgangsta.de/optimierung-meines-blogs</link> <comments>http://www.phpgangsta.de/optimierung-meines-blogs#comments</comments> <pubDate>Mon, 31 Aug 2009 17:46:20 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Optimierung]]></category> <category><![CDATA[SEO]]></category> <category><![CDATA[SEO all in One Pack]]></category> <category><![CDATA[Suchmaschinen Optimierung]]></category> <category><![CDATA[wordpress]]></category> <category><![CDATA[Wordpress Plugin]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=370</guid> <description><![CDATA[SEO ist in aller Munde. Es gibt Millionen von SEO-Experten, die einen &#8220;100%-ig auf Platz 1 bei Google&#8221; bringen können. Natürlich für viel Geld, und mit komischen, teils verbotenen Methoden. Ich verlasse mich da lieber auf die kleinen Tipps und Tricks, die man so liest, und die auch Sinn machen. Auch Google gibt Webmastern Tipps, [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p><a href="http://de.wikipedia.org/wiki/Search_Engine_Optimization" target="_blank">SEO</a> ist in aller Munde. Es gibt Millionen von SEO-Experten, die einen &#8220;100%-ig auf Platz 1 bei Google&#8221; bringen können. Natürlich für viel Geld, und mit komischen, teils verbotenen Methoden.</p><p>Ich verlasse mich da lieber auf die kleinen Tipps und Tricks, die man so liest, und die auch Sinn machen. Auch Google gibt Webmastern Tipps, um ihre Seiten gut indizierbar zu machen, und so einen guten <a href="http://de.wikipedia.org/wiki/PageRank" target="_blank">Pagerank</a> zu erhalten. Interessante Hintergrund-Informationen gibt es zB bei <a href="https://www.google.com/webmasters/tools/home?hl=de" target="_blank">Google&#8217;s Webmaster Tools</a>.</p><p>Ich möchte hier keine riesen Sammlung eröffnen, sondern nur das WordPress-Plugin &#8220;<a href="http://wordpress.org/extend/plugins/all-in-one-seo-pack/" target="_blank">All in One SEO Pack</a>&#8221; vorstellen. Dieses Plugin hilft dabei, auf jeder Seite unterschiedliche und vor allem passende Keywords und Descriptions setzen zu lassen (automatisch extrahiert aus dem Artikel-Text). Auch den Titel kann man auf jeder Seite anpassen lassen. Des weiteren unterstützt es die Möglichkeit, <a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;answer=139394" target="_blank">doppelte Inhalte unter verschiedenen URLs zu vermeiden mit dem &#8220;canonical&#8221;-Tag</a>.</p><p>Damit sind die wichtigsten Dinge erstmal abgedeckt. Alle anderen Meta-Tags sind heutzutage relativ unwichtig geworden, jedenfalls liest man das oft.</p><p>Schaut es euch selbst an, ich finde es sehr hilfreich, und werde es auch vorerst dabei belassen.</p><p>So sehen die Optionen aus:</p><p><img class="alignnone size-full wp-image-371" title="seo" src="http://www.phpgangsta.de/wp-content/uploads/seo.JPG" alt="seo" width="625" height="748" /></p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/optimierung-meines-blogs/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Erste Twitter Tests</title><link>http://www.phpgangsta.de/erste-twitter-tests</link> <comments>http://www.phpgangsta.de/erste-twitter-tests#comments</comments> <pubDate>Mon, 29 Jun 2009 15:18:48 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[ccc]]></category> <category><![CDATA[twitter]]></category> <category><![CDATA[twittersuite]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=130</guid> <description><![CDATA[Da Twitter in aller Munde ist, habe ich es mir am Wochenende nun auch mal angeschaut und mir einen Account eingerichtet. Zwar schon die letzten Monate des öfteres gehört und gelesen, konnte ich mich bisher nicht davon überzeugen lassen. Da auch keiner meiner Bekannten twittert, war der Anreiz nicht wirklich groß. Jetzt am Wochenende habe [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p>Da Twitter in aller Munde ist, habe ich es mir am Wochenende nun auch mal angeschaut und mir einen Account eingerichtet. Zwar schon die letzten Monate des öfteres gehört und gelesen, konnte ich mich bisher nicht davon überzeugen lassen. Da auch keiner meiner Bekannten twittert, war der Anreiz nicht wirklich groß.</p><p>Jetzt am Wochenende habe ich einen Podcast vom Chaos Computer Club: <a href="http://chaosradio.ccc.de/cr147.html" target="_blank">Chaosradio Folge 147</a> gehört, der mich nun zu Experimenten angespornt hat.</p><p>Ein Account ist schnell erstellt, eine Statusnachricht geschrieben, und ein paar Leuten folge ich auch bereits.</p><p>Heute habe ich mir das WordPress-Plugin <a href="http://danzarrella.com/beyond-tweetbacks-introducing-tweetsuite.html" target="_blank">TwitterSuite</a> installiert, mit dem ich hoffe, automatische Tweets zu senden bei neuen Beiträgen, Last Tweets anzuzeigen und einigem mehr. Dieser Post ist auch dazu da, diese Funktionalität mal zu testen. Ich hoffe, dass es funktioniert <img src='http://www.phpgangsta.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><p>EDIT: Hmm, das ging wohl voll in die Hose. Habe wohl curl nicht installiert auf dem Server. *verschnauf* Hätte ja auch so einfach sein können.</p><p>Da ich jetzt weder Zeit noch Lust habe, probiere ich nun den <a href="http://blog.victoriac.net/blog/twitter-updater/" target="_blank">twitter_updater</a>.</p><p>EDIT2: Scheint zu funktionieren! *jubel*</p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/erste-twitter-tests/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Design angepasst</title><link>http://www.phpgangsta.de/design-angepasst</link> <comments>http://www.phpgangsta.de/design-angepasst#comments</comments> <pubDate>Tue, 16 Jun 2009 20:05:02 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[design]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=57</guid> <description><![CDATA[So, ich habe das Theme gewechselt, und mein Bruder hat mir sogar einen individuellen Header spendiert! Alles was Grafik betrifft ist nicht so mein Ding, aber dafür kennt man ja seine Leute Danke dafür! Keine ähnlichen Artikel.<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p>So, ich habe das Theme gewechselt, und mein Bruder hat mir sogar einen individuellen Header spendiert! Alles was Grafik betrifft ist nicht so mein Ding, aber dafür kennt man ja seine Leute <img src='http://www.phpgangsta.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><p>Danke dafür!</p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/design-angepasst/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>WordPress und meine Plugins</title><link>http://www.phpgangsta.de/wordpress-und-meine-plugins</link> <comments>http://www.phpgangsta.de/wordpress-und-meine-plugins#comments</comments> <pubDate>Sun, 14 Jun 2009 22:46:24 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[plugins]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=26</guid> <description><![CDATA[Da dies mein erster Blog ist, experimentiere ich natürlich auch etwas mit WordPress. Aktuell habe ich die Plugins WP-Cumulus WP-Memory-Usage WP-ServerInfo SyntaxHighlighter Evolved installiert. Gibt es sonst noch welche, die ich unbedingt kennen muss und nutzen sollte? Was tut ihr gegen Spam in den Comments? Akismet wird ja bereits mitgeliefert, man muss es nur noch [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p>Da dies mein erster Blog ist, experimentiere ich natürlich auch etwas mit WordPress. Aktuell habe ich die Plugins</p><ul><li>WP-Cumulus</li><li>WP-Memory-Usage</li><li>WP-ServerInfo</li><li>SyntaxHighlighter Evolved</li></ul><p>installiert. Gibt es sonst noch welche, die ich unbedingt kennen muss und nutzen sollte?</p><p>Was tut ihr gegen Spam in den Comments? Akismet wird ja bereits mitgeliefert, man muss es nur noch aktivieren. Welches Anti-Spam-Plugin bevorzugt ihr?</p><p>Ich habe ausserdem noch Probleme mit dem Einrücken des php Codes, irgendwie klappt das noch nicht so wie ich möchte. Hat jemand Erfahrung damit und einen Tip?</p><p>Und hier noch ein kurzer php-Code-Test:</p><pre class="brush: php; title: ; notranslate">
&lt;?
echo &quot;bla&quot;;
class MyFirstClass {
public $name = null;
public function myTest() {
return &quot;just a test&quot;;
}
}
?&gt;
</pre><p>Test Ende.</p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/wordpress-und-meine-plugins/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: basic
Database Caching 1/59 queries in 0.277 seconds using disk: basic
Object Caching 1769/1892 objects using disk: basic

Served from: www.phpgangsta.de @ 2012-02-08 01:21:05 -->
