<?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 / MySQL / Linux Stories</title>
	<atom:link href="http://xfragger.de/feed" rel="self" type="application/rss+xml" />
	<link>http://xfragger.de</link>
	<description>Mein Erfahrungen in der Webentwicklerwelt</description>
	<lastBuildDate>Thu, 15 Jul 2010 12:14:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>PHP 5.3 DateTime Objekt &#8211; schwerwiegender Bug?</title>
		<link>http://xfragger.de/275/php-5-3-datetime-objekt-schwerwiegender-bug</link>
		<comments>http://xfragger.de/275/php-5-3-datetime-objekt-schwerwiegender-bug#comments</comments>
		<pubDate>Wed, 14 Jul 2010 20:14:29 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[datetime]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[zenddate]]></category>

		<guid isPermaLink="false">http://xfragger.de/?p=275</guid>
		<description><![CDATA[Eigentlich war ich ziemlich begeistert, vom DateTime Objekt. Endlich richtig einfach mit Daten umgehen und das auch noch inkl Zeitzonen etc. Seitdem ich allerdings mit einem Kollegen einen wirklich &#8220;krassen&#8221; Bug fand, bin ich nicht mehr so begeistert! Reproduzierbar ist er folgendermaßen: $from = new DateTime&#40;&#41;; $from-&#62;setTime&#40;0, 0, 0&#41;; $from-&#62;setISODate&#40;2010, 28, 1&#41;; //Montag der 28ten [...]]]></description>
			<content:encoded><![CDATA[<p>Eigentlich war ich ziemlich begeistert, vom <a href="http://de.php.net/manual/de/class.datetime.php" target="_blank">DateTime Objekt</a>. Endlich richtig einfach mit Daten umgehen und das auch noch inkl Zeitzonen etc.<br />
Seitdem ich allerdings mit einem Kollegen einen wirklich &#8220;krassen&#8221; Bug fand, bin ich nicht mehr so begeistert!</p>
<p>Reproduzierbar ist er folgendermaßen:<br />
<span id="more-275"></span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$from</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$from</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTime</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$from</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setISODate</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2010</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">28</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//Montag der 28ten Woche 2010</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$from</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'d.m.Y H:i'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//A</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$from</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTimestamp</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//B</span>
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Y-m-d H:i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$from</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTimestamp</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//C</span></pre></div></div>

<p>A: das ausgegeben Datum stimmt, es ist der 12.07.2010<br />
B: der Timestamp ist viel zu hoch: 1291849200<br />
C: der Beweis, der Timestamp gehört zum 29.05.2011 00:00</p>
<p>Wir haben lange versucht herauszufinden, warum dies passiert. Ein hässlicher Workaround ist dieser:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$from</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> DateInterval<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'P0D'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wir fügen also ein Interval von 0 Tagen (oder Stunden, Minuten etc) hinzu, wodurch sich eigentlich nichts ändern sollte. Danach stimmt das Ergebnis von ->getTimestamp() allerdings, nämlich 1278885600. </p>
<p>Nachdem wir absolut keinen Grund feststellen konnten, haben wir das Vertrauen verloren und nutzen seitdem <a href="http://zendframework.com/manual/de/zend.date.html" target="_blank">Zend_Date</a>, welches, meiner Meinung nach, besser und einfacher zu bedienen ist. Das ZendFramework ist sowieso schon im aktuellen Projekt eingebunden (nicht als Framework an sich, eher als Klassensammlung), als sprach es auch nicht dagegen, einen riesen Klotz an Dateien/Klassen zu integrieren, um nur eine Klasse zu nutzen.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setWeek</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">28</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setYear</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2010</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setWeekday</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setHour</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMinute</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setSecond</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTimestamp</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Liefert das erwartete Ergebnis: 1278885600</p>
<p>Ist das nun wirklich ein riesen DateTime Bug oder liegt ein Denkfehler unsererseits vor?</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/275/php-5-3-datetime-objekt-schwerwiegender-bug/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iterator oder IteratorAggregated Interface nutzen?</title>
		<link>http://xfragger.de/266/iterator-oder-iteratoraggregated-interface-nutzen</link>
		<comments>http://xfragger.de/266/iterator-oder-iteratoraggregated-interface-nutzen#comments</comments>
		<pubDate>Mon, 28 Jun 2010 20:30:56 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[arrayiterator]]></category>
		<category><![CDATA[iterator]]></category>
		<category><![CDATA[iteratoraggregate]]></category>
		<category><![CDATA[traversable]]></category>

		<guid isPermaLink="false">http://xfragger.de/?p=266</guid>
		<description><![CDATA[PHP bietet das Iterator Interface an, um Objekte direkt via foreach zu iterieren. class MyClass implements Interator &#123; private $array; &#125; &#160; $obj = new MyClass&#40;&#41;; foreach&#40;$obj as $key =&#62; $val&#41;&#123; ... &#125; Damit dieses Konstrukt funktioniert, benötigt die Klasse &#8220;MyClass&#8221; ein paar weitere Methoden und ein Attribut, welche vom Interface vorgeschrieben werden: public function [...]]]></description>
			<content:encoded><![CDATA[<p>PHP bietet das <a href="http://de.php.net/manual/de/class.iterator.php" target="_blank">Iterator</a> Interface an, um Objekte direkt via foreach zu iterieren.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MyClass implements Interator <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$array</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$obj</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #339933;">...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><span id="more-266"></span><br />
Damit dieses Konstrukt funktioniert, benötigt die Klasse &#8220;MyClass&#8221; ein paar weitere Methoden und ein Attribut, welche vom Interface vorgeschrieben werden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">rewind</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">array</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> valid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">array</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointer</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nun geht das ganze aber auch viel einfacher und mit saubererem Code, mit dem <a href="http://de.php.net/manual/de/class.iteratoraggregate.php" target="_blank">IteratorAggregate</a> Interface und einem <a href="http://de.php.net/manual/de/spl.iterators.php" target="_blank">schon vorhandenem Iterator</a> (wie dem <a href="http://de.php.net/manual/de/class.arrayiterator.php" target="_blank">ArrayIterator</a>). Das Interface ist ziemlich Ähnlich und implementiert ebenfalls <a href="http://de.php.net/manual/de/class.traversable.php" target="_blank">Traversable</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MyClass implements IteratorAggregate <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$array</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getIterator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayIterator<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$obj</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #339933;">...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/266/iterator-oder-iteratoraggregated-interface-nutzen/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress 3 MU auf lighttpd und das &#8220;langsame Bilder&#8221;-Problem</title>
		<link>http://xfragger.de/257/wordpress-3-mu-auf-lighttpd-und-das-langsame-bilder-problem</link>
		<comments>http://xfragger.de/257/wordpress-3-mu-auf-lighttpd-und-das-langsame-bilder-problem#comments</comments>
		<pubDate>Fri, 25 Jun 2010 19:32:54 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[blogs.php]]></category>
		<category><![CDATA[langsam]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[ms-files.php]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wordpress 3]]></category>
		<category><![CDATA[wordpress mu]]></category>

		<guid isPermaLink="false">http://xfragger.de/?p=257</guid>
		<description><![CDATA[Dieser und der ein oder andere Blog, welche hauptsächlich von meiner Frau betrieben werden, läuft nun auf WordPress 3, weil es mir auf den Geist ging immer x Blogs aktuell zu halten, laufen nun alle mit aktiviertem MU. Da auf meinem Websever lighttpd und nicht apache läuft, konnte ich mich nicht 100%ig an die Anleitung [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://xfragger.de/wp-content/uploads/2010/06/wordpress-300x299.png" rel="lightbox[257]"><img class="alignleft size-thumbnail wp-image-259" title="wordpress-300x299" src="http://xfragger.de/wp-content/uploads/2010/06/wordpress-300x299-150x150.png" alt="" width="150" height="150" /></a>Dieser und der ein oder andere Blog, welche hauptsächlich von meiner Frau betrieben werden, läuft nun auf WordPress 3, weil es mir auf den Geist ging immer x Blogs aktuell zu halten, laufen nun alle mit aktiviertem MU.</p>
<p>Da auf meinem Websever lighttpd und nicht apache läuft, konnte ich mich nicht 100%ig an die Anleitung auf der WP MU Seite halten.</p>
<p><span id="more-257"></span>In lighttpd gibt es kein .htaccess, also müssen die Rewriteregeln (ich nutze Subdomains, keine Unterverzeichnisse), in die lighttpd-config. Das ganze sieht so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$HTTP</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;host&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span>~ <span style="color: #0000ff;">&quot;^((.*).?example\.de)$&quot;</span> <span style="color: #009900;">&#123;</span>
  server<span style="color: #339933;">.</span>document<span style="color: #339933;">-</span>root <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/var/www/.../wp3/&quot;</span>
  server<span style="color: #339933;">.</span>error<span style="color: #339933;">-</span>handler<span style="color: #339933;">-</span><span style="color: #cc66cc;">404</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/index.php&quot;</span>  <span style="color: #666666; font-style: italic;">#hierdurch erspart man sich rewrite regeln für schöne permalinks
</span>  url<span style="color: #339933;">.</span>rewrite<span style="color: #339933;">-</span>once <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">&quot;^/(.*/)?files/$&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/index.php&quot;</span><span style="color: #339933;">,</span>
   <span style="color: #0000ff;">&quot;^/(.*/)?files/(.*)&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/wp-content/blogs.php?file=<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">&quot;^/([_0-9a-zA-Z-]+/)?(wp-.*)&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">&quot;^/([_0-9a-zA-Z-]+/)?(.*\.php)$&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Der Rest lief einwandfrei nach offizieller Anleitung, da in einigen der anderen Blogs allerdings recht viele Bilder sind, viel mir sofort die mangelnde Performance diesbezüglich auf. Der Grund war schnell gefunden, gab es 40 Bilder auf einer Seite, bedeutete dies, aufgrund der zweiten Rewriteregel, jeweils einen Aufruf eines PHP Skriptes, welches einen ganzen Schweif an includes inkl. Datenbankverbindungen und Queries mit sich bringt.</p>
<p>Die Lösung war, mit ein wenig Linuxwissen, aber schnell gefunden: Symlinks für jeden einzelnen Blog. Erfordert zwar ein wenig mehr Verwaltungsaufwand, spart aber das Umleiten über ein PHP Skript, um Bilder anzuzeigen. Die Regel muss dann so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">    <span style="color: #0000ff;">&quot;^/(.*/)?files/(.*)$&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;/wp-content/blogs.dir/%0/files/<span style="color: #006699; font-weight: bold;">$2</span>&quot;</span><span style="color: #339933;">,</span></pre></div></div>

<p>Das %0 funktioniert so nur, weil die Hostdefinition (Zeile 1 im oberen Code) als Pattern definiert ist!</p>
<p>Im, laut Anleitung angelegten, blogs.dir Verzeichnis müssen nun Symlinks angelegt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">ln <span style="color: #339933;">-</span>s <span style="color: #339933;">/</span><span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">/</span>www<span style="color: #339933;">/.../</span>wp3<span style="color: #339933;">/</span>wp<span style="color: #339933;">-</span>content<span style="color: #339933;">/</span>blogs<span style="color: #339933;">.</span><span style="color: #990000;">dir</span><span style="color: #339933;">/</span><span style="color: #009900;">&#91;</span>BlogID<span style="color: #009900;">&#93;</span> <span style="color: #339933;">/</span><span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">/</span>www<span style="color: #339933;">/.../</span>wp3<span style="color: #339933;">/</span>wp<span style="color: #339933;">-</span>content<span style="color: #339933;">/</span>blogs<span style="color: #339933;">.</span><span style="color: #990000;">dir</span><span style="color: #339933;">/</span><span style="color: #009900;">&#91;</span>subdomain<span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>example<span style="color: #339933;">.</span>de</pre></div></div>

<p>Falls jemand eine elegantere Lösung kennt, als für jeden Blog einen Symlink anzulegen, als her damit!</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/257/wordpress-3-mu-auf-lighttpd-und-das-langsame-bilder-problem/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP Performance Blog verlost 2 PHP Magazin Jahresabos</title>
		<link>http://xfragger.de/254/php-performance-blog-verlost-2-php-magazin-jahresabos</link>
		<comments>http://xfragger.de/254/php-performance-blog-verlost-2-php-magazin-jahresabos#comments</comments>
		<pubDate>Fri, 18 Jun 2010 18:31:43 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[gewinnspiel]]></category>
		<category><![CDATA[php magazin]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=254</guid>
		<description><![CDATA[Ich denke der Titel sagt alles, hier die Teilnahmebedingungen http://phpperformance.de/php-magazin-abo-verlosung-gewinne-eines-von-zwei-jahresabos/]]></description>
			<content:encoded><![CDATA[<p>Ich denke der Titel sagt alles, hier die Teilnahmebedingungen<br />
<a href="http://phpperformance.de/php-magazin-abo-verlosung-gewinne-eines-von-zwei-jahresabos/">http://phpperformance.de/php-magazin-abo-verlosung-gewinne-eines-von-zwei-jahresabos/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/254/php-performance-blog-verlost-2-php-magazin-jahresabos/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL: Index über mehrere Spalten</title>
		<link>http://xfragger.de/246/mysql-index-uber-mehrere-spalten</link>
		<comments>http://xfragger.de/246/mysql-index-uber-mehrere-spalten#comments</comments>
		<pubDate>Wed, 21 Apr 2010 19:41:58 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[optimierung]]></category>
		<category><![CDATA[query optimierung]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=246</guid>
		<description><![CDATA[Ich habe bereits mehrfach mitbekommen, dass anscheinend kaum jemand weiß, dass man Indizes auch über mehrere Spalten anlegen kann. Zuerst sollte erwähnt werden, dass MySQL im Normalfall pro Query nur EINEN pro Tabelle Index auf einmal nutzen kann (es gibt Ausnahmen, merged-index, aber nur unter bestimmten Umständen in bestimmten Queries). Ein Beispiel für den Einsatz [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe bereits mehrfach mitbekommen, dass anscheinend kaum jemand weiß, dass man Indizes auch über mehrere Spalten anlegen kann.</p>
<p>Zuerst sollte erwähnt werden, dass MySQL im Normalfall pro Query nur EINEN pro Tabelle Index auf einmal nutzen kann (es gibt Ausnahmen, merged-index, aber nur unter bestimmten Umständen in bestimmten Queries).</p>
<p>Ein Beispiel für den Einsatz eines Index über mehrere Spalten, wäre z.B. das folgende:</p>
<p><span id="more-246"></span>Eine Tabelle, in welcher Nachrichten zwischen Benutzern aufbewahrt werden, folgende Spalten sind vorhanden:</p>
<p>ID (int), receiverUserID(int), senderUserID(int), subject(varchar), text(text), time(int)</p>
<p>Wollen wir nun alle Nachrichten finden, die User 123 an User 234 geschickt hat und das Ergebnis noch nach Zeit sortieren, brauchen wir folgendes Query:</p>
<pre>
SELECT ID, subject, text, time
FROM message
WHERE receiverUserID = 234 AND senderUserID = 123
ORDER BY time ASC
</pre>
<p>Zuerst fällt auf, dass man die Nachrichten nach ID sortieren kann, was im Normalfall besser ist, als nach time, da wir davon ausgehen, dass die ID sich von Nachricht zu Nachricht um eins erhöht und die neusten somit die höchsten IDs haben.</p>
<p>Ohne das Wissen, dass es mehrspaltige Indizes gibt, würde man einen Index auf receiverUserID oder senderUserID legen, alternativ sogar beides, allerdings würde MySQL dann nur einen von beiden nutzen.<br />
Also legt man einen über beide an, was bei großen Datenmengen einen extremen Geschwindigkeitsschub bringen kann.</p>
<p>Um die Sortierung nun auch noch über den Index zu regeln, könnten man als dritte Spalte nun noch die ID in den Index aufnehmen, was allerdings nur sinnig ist, wenn man davon ausgeht, dass das Ergebnis wirklich viele Ergebnisse erzielen wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/246/mysql-index-uber-mehrere-spalten/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>High Performance MySQL Konfiguration &#8211; my.cnf</title>
		<link>http://xfragger.de/243/high-performance-mysql-konfiguration-my-cnf</link>
		<comments>http://xfragger.de/243/high-performance-mysql-konfiguration-my-cnf#comments</comments>
		<pubDate>Fri, 02 Apr 2010 10:37:38 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[high performance]]></category>
		<category><![CDATA[konfiguration]]></category>
		<category><![CDATA[my.cnf]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=243</guid>
		<description><![CDATA[Ich beschäftige mich aus beruflichen Gründen schon recht lange mit der Thematik und möchte das gesammelte Wissen nun mal niederschreiben. Es gibt definitiv keine Konfiguration, die allgemeingültig ist, aber ich versuche hiermit eine Hilfestellung zu geben, wie man die besten Werte für die eigenen Bedürfnisse findet. Nicht nur der Server spielt eine Rolle, auch die [...]]]></description>
			<content:encoded><![CDATA[<p>Ich beschäftige mich aus beruflichen Gründen schon recht lange mit der Thematik und möchte das gesammelte Wissen nun mal niederschreiben.</p>
<p>Es gibt definitiv keine Konfiguration, die allgemeingültig ist, aber ich versuche hiermit eine Hilfestellung zu geben, wie man die besten Werte für die eigenen Bedürfnisse findet.</p>
<p>Nicht nur der Server spielt eine Rolle, auch die Storage-Engine, um sich viel Stress zu ersparen, sollte man im vorraus planen, was man braucht und für welche Engine man sich entscheidet. Auch hier gibt es keine Universallösung, jede hat ihre Vor- und Nachteile, aber darauf will ich in diesem Eintrag nicht eingehen.</p>
<p>Da ich für das aktuell laufende Projekt nur InnoDB einsetze, beziehen sich die Ratschläge auf eine reine InnoDB Konfiguration und sollten ab MySQL Version 5.0 funktionieren.</p>
<p><span id="more-243"></span>&#8220;<strong>innodb_dirty_pages_pct</strong>&#8221;<br />
Gibt an, wie viele  InnoDB-Buffer-Pages im RAM vorhanden sein dürfen, ohne auf Festplatte geschrieben worden zu sein. Standard ist 90%, was für die meisten Umgebungen absolut OK sein sollte.</p>
<p>&#8220;<strong>thread_cache_size</strong>&#8221;<br />
Wie viele Threads dürfen sich im Cache befinden? Jede Verbindung zum Server braucht einen eigenen Thread, ist die Verbindung beendet, kann der Thread im Cache gelagert werden und steht der nächsten Verbindung zur Verfügung. Threads zu erstellen ist unnötiger Overhead, &#8220;SHOW GLOBAL STATUS&#8221; auf der MySQL Konsole gibt in der Variable &#8220;threads_created&#8221; aus, wie viele Threads erstellt werden. Dieser Wert sollte um maximal 10 pro Sekunde steigen, steigt er schneller, kann der Thread-cache vergrößert werden.</p>
<p>&#8220;<strong>table_definition_cache</strong>&#8221;<br />
Sollte größer oder gleich der Anzahl der vorhandenen Tabellen sein um unnötigen I/O Overhead zu ersparen.</p>
<p>&#8220;<strong>innodb_open_files</strong>&#8221;<br />
Sollte größer oder gleich der Anzahl der vorhandenen .ibd Dateien im MySQL-Datenverzeichnis sein (bei Debian meistens /var/lib/mysql).</p>
<p>&#8220;<strong>innodb_log_buffer_size</strong>&#8221;<br />
Die globale Variable &#8220;innodb_os_log_written&#8221; hilft hier bei der Ermittlung eines sinnvollen Wertes, der Wert sollte nicht zu schnell steigen, hier kann I/O Performance gewonnen werden.</p>
<p>&#8220;<strong>skip_name_resolve</strong>&#8221;<br />
Sollte aktiv sein, damit nicht für jeden Client 2 DNS-Lookups stattfinden, gleichzeitig bedeutet dies, dass Berechtigungen nur noch auf IP und nicht auf Hostnamen-Ebene verteilt werden können.</p>
<p>&#8220;<strong>innodb_flush_method</strong>&#8221;<br />
Falls ein Hardware-Raid mit ordentlichem Cache und Battery-Backup genutzt wird, sollte hier 0_direct eingestellt werden, um zu verhindern, dass OS-Buffer genutzt werden, welche das Logfile unbrauchbar machen könnten, wenn der Server abstürzt.</p>
<p>&#8220;<strong>innodb_flush_log_at_trx</strong>&#8221;<br />
Sollte auf 1 gestellt werden, damit jede beendete Transaktion sofort im Binarylog landet, um Datenverlust zu verhindern, falls der Server abstürzt. Der Wert 1 ist der beste Kompromiss zwischen Performance und Datensicherheit!</p>
<p>Diverse Key-Buffers und andere Caches (ausgenommen dem Query-Cache) können sehr klein gehalten werden (nicht abschalten, MySQL nutzt MyISAM für die Metatabellen). Hier würde nur sinnlos RAM belegt werden!</p>
<p>Auf Linux-Systemen sollte die <strong>swappiness</strong> noch auf 0 oder 1 gestellt werden, um zu verhindern, dass der Kernel MySQL Buffers in den SWAP-Space verschiebt, falls diese länger nicht genutzt werden. Swap-I/O ist weitaus schlimmer als normaler HDD-I/O, da MySQL &#8220;denkt&#8221; es würde mit schnellem RAM arbeiten, welcher in Wirklichkeit aber auf der HDD im Swap zu finden ist. Auf Debian-Systemen kann man diesen Wert mittels /etc/sysctl.conf setzen (vm.swappiness = 0) und danach &#8220;sysctl -p&#8221; ausführen.</p>
<p>Der restlich verfügbare Arbeitsspeicher sollte dem <strong>InnoDB-Buffer-Pool</strong> zur Verfügung gestellt werden, ist dieser groß genug, kann auf nahezu alle HDD-Leseabfragen verzichtet werden und es entsteht nahezu nur noch Schreib-I/O.</p>
<p>Es gibt noch weitere Einstellungen bezüglich des InnoDB-Tablespace und allgemeinen Einstellungen, falls hier noch Intresse besteht, hinterlasst nen Kommentar, werde dann versuchen zeitnah einen weiteren Beitrag zu schreiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/243/high-performance-mysql-konfiguration-my-cnf/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haystack und Needle vertauschen &#8211; Wer kennts nicht?</title>
		<link>http://xfragger.de/240/haystack-und-needle-vertauschen-wer-kennts-nicht</link>
		<comments>http://xfragger.de/240/haystack-und-needle-vertauschen-wer-kennts-nicht#comments</comments>
		<pubDate>Sat, 20 Mar 2010 11:06:46 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[haystack]]></category>
		<category><![CDATA[needle]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=240</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://xfragger.de/wp-content/uploads/2010/03/nedle-und-haystack.jpg" rel="lightbox[240]"><img class="aligncenter size-full wp-image-241" src="http://xfragger.de/wp-content/uploads/2010/03/nedle-und-haystack.jpg" alt="" width="600" height="848" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/240/haystack-und-needle-vertauschen-wer-kennts-nicht/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UnitedDomains Domain-Weltkarte für alle Blogger</title>
		<link>http://xfragger.de/236/uniteddomains-domain-weltkarte-fur-alle-blogger</link>
		<comments>http://xfragger.de/236/uniteddomains-domain-weltkarte-fur-alle-blogger#comments</comments>
		<pubDate>Fri, 19 Mar 2010 18:35:00 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=236</guid>
		<description><![CDATA[Diverse andere Blogs haben auch schon darauf hingewiesen. Alle Blogger, die die Domain-Weltkarte abstauben wollen, müssen nur einen Backlink auf United Domains setzen. Unterm Strich keine schlechte SEO Taktik, aber was solls. Auf der Karte sind alle Toplevel Domains verzeichnet, macht sich im Büro bestimmt nicht schlecht. Hier übrigens der Link zur Aktion. Gleichzeitig kann [...]]]></description>
			<content:encoded><![CDATA[<p>Diverse andere Blogs haben auch schon darauf hingewiesen. Alle Blogger, die die <a href="http://www.domain-karte.de/" target="_blank">Domain-Weltkarte</a> abstauben wollen, müssen nur einen Backlink auf <a href="http://www.united-domains.de/" target="_blank">United Domains</a> setzen. Unterm Strich keine schlechte SEO Taktik, aber was solls.</p>
<p>Auf der Karte sind alle Toplevel Domains verzeichnet, macht sich im Büro bestimmt nicht schlecht.</p>
<p>Hier übrigens der <a href="https://www.united-domains.de/news-magazin/neue-aktion-fuer-alle-blogger-domain-weltkarte-gratis-361.html" target="_blank">Link</a> zur Aktion. Gleichzeitig kann man seinen eigenen Blog noch ein wenig pushen:</p>
<blockquote><p>Wenn Sie die Domain-Weltkarte dann von uns per Post erhalten haben (dauert etwa 1 bis 2 Wochen), machen Sie ein Foto von sich und der Wand in Ihrem Büro/Wohnung, an der die Domain-Weltkarte ihren Platz gefunden hat und veröffentlichen das ganze wieder in Ihrem Blog als kleinen Beitrag.</p>
<p>Schicken Sie den Link zu diesem Beitrag wieder an <a href="mailto:aktion@united-domains.de">aktion@united-domains.de</a>. Im April werden wird dann auf unserer Website alle Links zu diesen Beiträgen/Fotos veröffentlichen und auch im Newsletter wieder darüber berichten &#8230;. Sie haben so also die Möglichkeit, etwas Werbung für Ihren eigenen Blog zu machen und weitere Besucher zu bekommen.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/236/uniteddomains-domain-weltkarte-fur-alle-blogger/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Werteingabe (Geld) in gültiges Float umwandeln</title>
		<link>http://xfragger.de/231/werteingabe-geld-in-gultiges-float-umwandeln</link>
		<comments>http://xfragger.de/231/werteingabe-geld-in-gultiges-float-umwandeln#comments</comments>
		<pubDate>Mon, 22 Feb 2010 21:31:39 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[float]]></category>
		<category><![CDATA[geld]]></category>
		<category><![CDATA[input]]></category>
		<category><![CDATA[money]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=231</guid>
		<description><![CDATA[Jeder hat seine eigene Art einen Geldbetrag einzugeben, der eine gibt 11,99 ein, der nächste 11.99. Weiter geht es mit den 1000er Trennzeichen, spätestens, wenn das System auch auf die amerikanische Schreibweise können soll, brauchen wir eine Methode, die jegliche Eingabe in einen gültigen Float-Wert umwandelt, am besten auch noch richtig. Nach langem hin und [...]]]></description>
			<content:encoded><![CDATA[<p>Jeder hat seine eigene Art einen Geldbetrag einzugeben, der eine gibt 11,99 ein, der nächste 11.99. Weiter geht es mit den 1000er Trennzeichen, spätestens, wenn das System auch auf die amerikanische Schreibweise können soll, brauchen wir eine Methode, die jegliche Eingabe in einen gültigen Float-Wert umwandelt, am besten auch noch richtig.</p>
<p>Nach langem hin und her und viel Recherche habe ich mir aus diversen Codefragmenten das hier zusammengebaut und es scheint zu funktionieren:<span id="more-231"></span></p>
<pre>	function price2float($string){
	    $string = trim($string);
		if(preg_match('/([0-9\.,-]+)/', $string, $matches)){
			// Zahl gefunden also können wir weitermachen
			$string = $matches[0];

			if(preg_match('/^[0-9.-\s]*[\,]{1}[0-9-]{0,2}$/', $string)){
				// Komma als Dezimal Separator
				// Alle Punkte entfernen und anschließend das Komma in einen Punkt umwandeln
				$string = str_replace(' ', '', $string);
				$string = str_replace('.', '', $string);
				$string = str_replace(',', '.', $string);
				return floatval($string);
			}
			elseif(preg_match('/^[0-9,-\s]*[\.]{1}[0-9-]{0,2}$/', $string)){
				// Punkt als Dezimal Separator
				// Alle Kommata entfernen
				$string = str_replace(' ', '', $string);
				$string = str_replace(',', '', $string);
				return floatval($string);
			}
			elseif(preg_match('/^[0-9.-\s]*[\.]{1}[0-9-]{0,3}$/', $string)){
				// Es gibt nur Tausender Separatoren
				// Alle Punkte enfernen
				$string = str_replace(' ', '', $string);
				$string = str_replace('.', '', $string);
				return floatval($string);
			}
			elseif(preg_match('/^[0-9,-\s]*[\,]{1}[0-9-]{0,3}$/', $string)){
				// Es gibt nur Tausender Separatoren
				// Alle Kommata enfernen
				$string = str_replace(' ', '', $string);
				$string = str_replace(',', '', $string);
				return floatval($string);
			}
			else{
				return floatval($string);
			}
		}
		else{
			return 0;
		}
	}
</pre>
<p>Beispiele zum selbsttesten:<br />
1234.456,78 =&gt; 123456.78<br />
1234,456.78 =&gt; 123456.78<br />
12.34 =&gt; 12.34<br />
12,34 =&gt; 12.34<br />
123.456.789 =&gt;  123456789<br />
123,456,789 =&gt; 123456789</p>
<p>wie immer bin ich für Verbesserungsvorschläge offen!</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/231/werteingabe-geld-in-gultiges-float-umwandeln/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>phphatesme feiert 500ersten Beitrag</title>
		<link>http://xfragger.de/229/phphatesme-feiert-500ersten-beitrag</link>
		<comments>http://xfragger.de/229/phphatesme-feiert-500ersten-beitrag#comments</comments>
		<pubDate>Mon, 22 Feb 2010 16:20:38 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://blog.xfragger.de/?p=229</guid>
		<description><![CDATA[Einer meine Stammblogs, feiert seinen 500ersten Beitrag. Herzlichen Glückwunsch hierzu, am besten seht ihr selbst mal rein: http://www.phphatesme.com/blog/allgemein/das-gewinnspiel-geht-los]]></description>
			<content:encoded><![CDATA[<p>Einer meine Stammblogs, feiert seinen 500ersten Beitrag. Herzlichen Glückwunsch hierzu, am besten seht ihr selbst mal rein: http://www.phphatesme.com/blog/allgemein/das-gewinnspiel-geht-los</p>
]]></content:encoded>
			<wfw:commentRss>http://xfragger.de/229/phphatesme-feiert-500ersten-beitrag/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
