<?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>ITWS BLOG &#187; php</title>
	<atom:link href="http://blog.itws.de/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.itws.de</link>
	<description>The cake is a lie!</description>
	<lastBuildDate>Tue, 31 Jan 2012 10:34:04 +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>YAP: Framework-Wahl</title>
		<link>http://blog.itws.de/823/yap-framework-wahl/</link>
		<comments>http://blog.itws.de/823/yap-framework-wahl/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 20:59:38 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[projekte]]></category>
		<category><![CDATA[codeigniter2]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[kohana]]></category>
		<category><![CDATA[namespaces]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pms]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[yap]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=823</guid>
		<description><![CDATA[YAP ist (zumindest vorerst) der Name des OpenSource Project Management Systems, welches ich entwickeln möchte. Angetrieben durch die Tatsache, dass keines der OpenSource Systeme mich wirklich zufrieden gestellt hat und meine Anforderungen abdecken konnte, hatte ich mich dazu entschieden mir selbst eines zu schreiben. Zur Zeit verwende ich Collabtive. Das war das Beste, was ich finden konnte, aber wirklich glücklich macht es mich auf Dauer auch nicht. Ich habe nun einige Zeit damit verbracht über das [...]]]></description>
			<content:encoded><![CDATA[<p>YAP ist (zumindest vorerst) der Name des OpenSource Project Management Systems, welches ich entwickeln möchte.</p>
<p>Angetrieben durch die Tatsache, dass keines der OpenSource Systeme mich wirklich zufrieden gestellt hat und meine Anforderungen abdecken konnte, hatte ich mich dazu entschieden mir selbst eines zu schreiben.</p>
<p>Zur Zeit verwende ich <a href="http://collabtive.o-dyn.de/" target="_blank">Collabtive</a>. Das war das Beste, was ich finden konnte, aber wirklich glücklich macht es mich auf Dauer auch nicht.</p>
<p>Ich habe nun einige Zeit damit verbracht über das Framework nachzudenken. Und hatte mich letztendlich für Symfony2 entschieden. Warum? Das Zend Framework 1 ist praktisch deprecated, dennoch steht das ZF2 noch nicht als finale Version zur Verfügung. Daher fällt beides für mich flach. Ich hatte also die Wahl zwischen Symfony2, Codeigniter2, Kohana und den zehntausend kleinen Frameworks, die so im Web rumschwirren. Gegen die &#8220;kleinen&#8221; Frameworks spricht einfach die fehlende Communitygröße.<br />
Ergo blieben Symfony2 und Codeigniter2 übrig.  Die Wahl auf Symfony viel einfach aus Sympathie-Gründen. Das Framework arbeitet mit Namespaces und das macht auf mich einfach einen moderneren Eindruck. Annsonsten geben sich die beiden Frameworks nicht viel.</p>
<p>Ich lese mich im Moment etwas ein und werde die nächsten Tage mal ein wenig Code in das <a href="https://github.com/itws/YAP" target="_blank">YAP GitHub Repository</a> pushen. Und ich werde bei Gelegenheit mal ein Konzept schreiben, wie ich mir das Ganze vorstelle.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/681/github-account-ausgepackt/" title="GitHub Account ausgepackt">GitHub Account ausgepackt</a></li><li><a href="http://blog.itws.de/815/zend-framework-resourcen/" title="Zend Framework Resourcen">Zend Framework Resourcen</a></li><li><a href="http://blog.itws.de/394/und-da-ist-es-ein-brauchbares-pms/" title="Und da ist es: Ein brauchbares PMS!">Und da ist es: Ein brauchbares PMS!</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=823&amp;md5=96bdf7982d607fe869e0e40d3cc05708" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/823/yap-framework-wahl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework Resourcen</title>
		<link>http://blog.itws.de/815/zend-framework-resourcen/</link>
		<comments>http://blog.itws.de/815/zend-framework-resourcen/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 18:16:10 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[links]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=815</guid>
		<description><![CDATA[Heute gibts hier für euch eine kleine Link-Sammlung für Zend Framework. Tutorials, Dokumentationen, Blogs, alles was das Entwickler-Herz begehrt &#160; Offizielles framework.zend.com/manual/ Die offizielle Dokumentation. Erster Anlaufpunkt, aber oftmalt findet man hier nicht alle Infos, die man sucht oder zu wenig Beispiele. devzone.zend.com/tag/Zend%20Framework Offizielle Zend Developer Zone framework.zend.com/wiki Das ZF Wiki Blogs phpdev.ro/tag/zend Anrei Gabreanus Artikel zum Framework. Der Blog ist leider inaktiv zf-tutorials.de Einige Tutorials zum ZF blog.astrumfutura.com Pádraic Brady weierophinney.net/matthew Matthew Weier O&#8217;Phinney akrabat.com Rob Allen codeutopia.net Jani Hartikainen dragonbe.com Michelangelo van Dam ajbrown.org A.J. [...]]]></description>
			<content:encoded><![CDATA[<p>Heute gibts hier für euch eine kleine Link-Sammlung für Zend Framework. Tutorials, Dokumentationen, Blogs, alles was das Entwickler-Herz begehrt <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<h1>Offizielles</h1>
<ul>
<li><strong><a href="http://framework.zend.com/manual/de/">framework.zend.com/manual/</a></strong> Die offizielle Dokumentation. Erster Anlaufpunkt, aber oftmalt findet man hier nicht alle Infos, die man sucht oder zu wenig Beispiele.</li>
<li><strong><a href="http://devzone.zend.com/tag/Zend%20Framework">devzone.zend.com/tag/Zend%20Framework</a></strong> Offizielle Zend Developer Zone</li>
<li><strong><a href="http://framework.zend.com/wiki/display/ZFDEV/Home">framework.zend.com/wiki</a></strong> Das ZF Wiki</li>
</ul>
<h1><span id="more-815"></span></h1>
<h1>Blogs</h1>
<ul>
<li><strong><a href="http://phpdev.ro/tag/zend">phpdev.ro/tag/zend</a></strong> Anrei Gabreanus Artikel zum Framework. Der Blog ist leider inaktiv</li>
<li><strong><a href="http://www.zf-tutorials.de/">zf-tutorials.de</a></strong> Einige Tutorials zum ZF</li>
<li><strong><a href="http://blog.astrumfutura.com/">blog.astrumfutura.com</a></strong> Pádraic Brady</li>
<li><strong><a href="http://weierophinney.net/matthew/">weierophinney.net/matthew</a></strong> Matthew Weier O&#8217;Phinney</li>
<li><strong><a href="http://akrabat.com/">akrabat.com</a></strong> Rob Allen</li>
<li><strong><a href="http://codeutopia.net/blog/">codeutopia.net</a></strong> Jani Hartikainen</li>
<li><strong><a href="http://www.dragonbe.com/">dragonbe.com</a></strong> Michelangelo van Dam</li>
<li><strong><a href="http://ajbrown.org/blog/">ajbrown.org</a></strong> A.J. Brown</li>
<li><strong><a href="http://blog.fedecarg.com/">blog.fedecarg.com</a></strong> Federico Cargnelutt</li>
<li><strong><a href="http://matthewturland.com/" target="_blank">matthewturland.com</a></strong> Matthew Turland</li>
<li><strong><a href="http://zfblog.de/">zfblog.de</a></strong> ZFBlog</li>
</ul>
<h1></h1>
<h1><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Podcasts</h1>
<div>
<ul>
<li><strong><a href="http://www.zendcasts.com/" target="_blank">zendcasts.com</a></strong> Podcasts zum Zend Framework</li>
</ul>
<h1></h1>
<h1>OpenSource Applikationen</h1>
<ul>
<li><strong><a href="http://www.magentocommerce.com/product/community-edition" target="_blank">Magento community edition</a></strong></li>
<li><strong><a href="http://digitaluscms.com/" target="_blank">Digitalus CMS</a></strong></li>
<li><strong><a href="http://www.omeka.org/" target="_blank">Omeka</a></strong></li>
<li><strong><a href="http://www.joobsbox.com/" target="_blank">Joobsbox</a></strong></li>
<li><strong><a href="http://piwik.org/" target="_blank">Piwik</a></strong></li>
</ul>
<h1></h1>
<h1>Sonstiges</h1>
<ul>
<li><strong><a href="http://www.zfsnippets.com/">zfsnippets.com</a></strong> Code Schnippsel zum Zend Framework</li>
<li><strong><a href="https://github.com/zendframework/zf2">github.com/zendframework/zf2</a></strong> Ofizielles Github Zend Framework 2 Repository</li>
</ul>
</div>
<h1></h1>
<h1>Bücher</h1>
<ul>
<li><strong><a href="http://www.survivethedeepend.com/">survivethedeepend.com</a></strong> Survive The Deep (kostenloses online Buch)</li>
<li><strong><a href="http://www.manning.com/allen/">manning.com/allen</a></strong> Zend Framework in Action by Rob Allen</li>
<li><strong>(Amazon) <a href="http://www.amazon.com/Zend-Enterprise-Patterns-Experts-Voice/dp/1430219742/">Zend-Enterprise-Patterns-Experts-Voice</a></strong></li>
<li><strong><a href="http://www.apress.com/9781430218258">apress.com/9781430218258</a></strong> Beginning Zend Framework</li>
<li><strong>(Amazon ) <a href="http://www.amazon.com/dp/0973862157/">Guide To Programming With Zend Framework</a></strong></li>
</ul>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/" title="Den Horizont erweitern: Das Zend Framework">Den Horizont erweitern: Das Zend Framework</a></li><li><a href="http://blog.itws.de/921/inspiration-fur-software-entwickler/" title="Inspiration für Software-Entwickler">Inspiration für Software-Entwickler</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=815&amp;md5=db012cd2b42798cbf31c4f258cc64ea0" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/815/zend-framework-resourcen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian: Von Apache zu Nginx &#8211; Teil 3: PHP</title>
		<link>http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/</link>
		<comments>http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 07:10:57 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[links]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[vps]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=763</guid>
		<description><![CDATA[Übersicht Teil 1: Vorwort Teil 2: Installation und Konfiguration Teil 3: PHP Teil 4: Einen Tomcat anbinden Teil 5: Basic Authentication Installation Im Gegenteil zu Apache oder Lighttpd erzeugt nginx selbst keine FastCGI Prozesse. Diese müssen seperat gestartet werden. Hierzu gibt es verschiedene Möglichkeiten. Glücklicherweise bringt PHP5 einen FastCGI Process Manager mit: PHP-FPM. Dieser erzeugt automatisch so viele FastCGI-Prozesse wie in der Umgebungsvariable PHP_FCGI_CHILDREN definiert wurde. Hierfür benötigt man lediglich das Paket php5-cgi und php5-fpm. [...]]]></description>
			<content:encoded><![CDATA[<h1>Übersicht</h1>
<ul>
<li><a href="http://blog.itws.de/747/debian-von-apache-zu-nginx-teil-1-vorwort/">Teil 1: Vorwort</a></li>
<li><a href="http://blog.itws.de/754/debian-von-apache-zu-nginx-teil-2-installation-und-konfiguration/">Teil 2: Installation und Konfiguration</a></li>
<li><strong>Teil 3: PHP</strong></li>
<li><a href="http://blog.itws.de/767/debian-von-apache-zu-nginx-teil-4-einen-tomcat-anbinden/">Teil 4: Einen Tomcat anbinden</a></li>
<li><a href="http://blog.itws.de/769/debian-von-apache-zu-nginx-teil-5-basic-authentication/">Teil 5: Basic Authentication</a></li>
</ul>
<h1>Installation</h1>
<div>Im Gegenteil zu Apache oder Lighttpd erzeugt nginx selbst keine FastCGI Prozesse. Diese müssen seperat gestartet werden. Hierzu gibt es verschiedene Möglichkeiten. Glücklicherweise bringt PHP5 einen FastCGI Process Manager mit: PHP-FPM. Dieser erzeugt automatisch so viele FastCGI-Prozesse wie in der Umgebungsvariable PHP_FCGI_CHILDREN definiert wurde. Hierfür benötigt man lediglich das Paket php5-cgi und php5-fpm.</div>
<div>
<p>Also erstmal alle benötigten Pakete Installlieren:</p>
<pre># apt-get install php5 php5-cli php5-cgi php5-suhosin php5-fpm</pre>
<p>Danach starte ich den Prozess Manager:</p>
<pre># /etc/init.d/php5-fpm restart</pre>
</div>
<div>Jetzt lege ich mir wieder eine Include Datei an für die PHP Konfiguration. Diese muss nämlich nun in jeden location-Block rein. Das möchte ich aber nicht.</div>
<div><span id="more-763"></span></div>
<pre># vim /etc/nginx/enable_php.inc</pre>
<div>
<p>Diese bekommt folgenden Inhalt:</p>
<pre>location ~ \.php$ {
    if (!-f $request_filename) {
        return 404;
    }

    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass   backend;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    include fastcgi_params;

    fastcgi_intercept_errors        on;
    fastcgi_ignore_client_abort     off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
}</pre>
</div>
<div>
<p>Diese Datei erhält nun noch Einzug in meine VHost-Configs:</p>
<pre>server {
    server_name itws.de www.itws.de;
    root /var/www/itws.de/www;

    # redirection to blog.itws.de
    rewrite ^(.*) http://blog.itws.de$1 permanent;
}

server {
    server_name blog.itws.de;
    root /var/www/itws.de/blog;

    include defaults.inc;
    include enable_php.inc;
}

server {
    server_name ci.itws.de;
    root /var/www/itws.de/ci;

    include defaults.inc;
    include enable_php.inc;
}</pre>
<p>&nbsp;</p>
<p>Im letzten Schritt muss der http-Block in der nginx.conf noch um einen upstream-Block erweitert werden:</p>
<pre>upstream backend {
    server 127.0.0.1:9000;
}</pre>
<p>Fertig! Nach einem Restart des nginx läuft PHP. Trotz meiner Panik um das Erzeugen der FastCGI Prozesse, alles ziemlich simpel. PHP-FPM sei Dank.</p>
</div>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/747/debian-von-apache-zu-nginx-teil-1-vorwort/" title="Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort">Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort</a></li><li><a href="http://blog.itws.de/783/wordpress-unter-nginx/" title="Wordpress unter Nginx">Wordpress unter Nginx</a></li><li><a href="http://blog.itws.de/769/debian-von-apache-zu-nginx-teil-5-basic-authentication/" title="Debian: Von Apache zu Nginx &#8211; Teil 5: Basic Authentication">Debian: Von Apache zu Nginx &#8211; Teil 5: Basic Authentication</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=763&amp;md5=b7867bd2f8fec37269cc0945de919926" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort</title>
		<link>http://blog.itws.de/747/debian-von-apache-zu-nginx-teil-1-vorwort/</link>
		<comments>http://blog.itws.de/747/debian-von-apache-zu-nginx-teil-1-vorwort/#comments</comments>
		<pubDate>Sun, 18 Sep 2011 09:11:52 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[vps]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=747</guid>
		<description><![CDATA[Übersicht Teil 1: Vorwort Teil 2: Installation und Konfiguration Teil 3: PHP Teil 4: Einen Tomcat anbinden Teil 5: Basic Authentication &#160; In diesem und den folgenden Beiträgen (es gibt jeden Tag einen) berichte ich euch ein wenig über meine Migration von Apache zu Nginx. Es war eigentlich nicht beabsichtigt, dass da ganze fünf Beiträge draus werden, aber irgendwie wurde es doch ziemlich viel Text und das war dann für einen einzelnen Artikel etwas zu [...]]]></description>
			<content:encoded><![CDATA[<h1>Übersicht</h1>
<ul>
<li><strong>Teil 1: Vorwort</strong></li>
<li><a href="http://blog.itws.de/754/debian-von-apache-zu-nginx-teil-2-installation-und-konfiguration/">Teil 2: Installation und Konfiguration</a></li>
<li><a href="http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/">Teil 3: PHP</a></li>
<li><a href="http://blog.itws.de/767/debian-von-apache-zu-nginx-teil-4-einen-tomcat-anbinden/">Teil 4: Einen Tomcat anbinden</a></li>
<li><a href="http://blog.itws.de/769/debian-von-apache-zu-nginx-teil-5-basic-authentication/">Teil 5: Basic Authentication</a></li>
</ul>
<p>&nbsp;</p>
<p>In diesem und den folgenden Beiträgen (es gibt jeden Tag einen) berichte ich euch ein wenig über meine Migration von Apache zu Nginx. Es war eigentlich nicht beabsichtigt, dass da ganze fünf Beiträge draus werden, aber irgendwie wurde es doch ziemlich viel Text und das war dann für einen einzelnen Artikel etwas zu viel. Da könnte man ja fast den Eindruck bekommen, ich würde gerne schreiben &#8230; Keine Angst, das einzige was ich gerne in großen Mengen schreibe ist Programmcode <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>However, ich hatte meinen VPS (Debian 6) bisher immer mit dem apache2 betrieben und auch meine Entwicklungsumgebung auf meinem Desktop und dem Notebook ebenfalls. Das hatte mehrere Gründe. Zum Einen bin ich mit dem Apache aufgewachsen und hatte eigentlich nie etwas anderes verwendet. Ich war auch immer sehr zufrieden mit dem Apachen. Es ist ein guter Webserver mit einer großen Auswahl an mächtigen Modulen und er ist sehr leicht zu konfigurieren. Da ich aber ab und an gerne etwas Neues ausprobiere und immer Spaß daran habe, an meinem Server zu schrauben (auf Software-Ebene), wollte ich mal einen anderen Webserver ausprobieren. Genaugenommen war das Projekt yaana.de einer der Auslöser. Ich möchte da noch etwas Performance aus dem Server quetschen. Und dafür sollte ich mich zu allererst vom Apachen verabschieden.</p>
<p>Zur Auswahl stehen also &#8211; neben dem Apachen &#8211; Lighttpd und Nginx (ausgesprochen: engine-x).</p>
<p><span id="more-747"></span></p>
<p>Zu allererst ein kurzer Überblick der Vor- und Nachteile der drei Kontrahenten: Apache, Lighttpd und Nginx:</p>
<h2></h2>
<h1>Der Apache</h1>
<h2>Vorteile</h2>
<ul>
<li><strong><span class="Apple-style-span" style="font-size: 13px;">Open Source &amp; Kostenlos</span></strong></li>
<li><strong>Community</strong>. Apache ist der am meist verbeiteste Webserver, die Community dahinter ist entsprechend gigantisch.</li>
<li><strong>Module</strong>. Es gibt unzählige Module für den Apache um praktisch jede Funktionalität abzudecken</li>
</ul>
<p>&nbsp;</p>
<h2>Nachteile</h2>
<ul>
<li><strong>Performance</strong>. Der Apache ist um einiges langsamer als seine Konkurenten. Vor Allem wenn es um das Ausliefern von statischen Dateien geht.</li>
<li><strong>Stabilität</strong>. Der Webserver hat schon mit schwachen DoS/DDoS Attacken Probleme, der Arbeitsspeicher (und das Logverzeichnis) verbrauchen innerhalb kurzer Zeit viel Speicher.</li>
<li><strong>Veraltet und überfüllt</strong>. Außerdem ist die Standard Konfiguration meistens nicht optimal und muss angepasst werden.</li>
<li>Die <strong>Entwicklung</strong> läuft vergleichsweise <strong>langsam</strong>.</li>
</ul>
<p>&nbsp;</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span></p>
<h1>Der Lighttpd</h1>
<h2>Vorteile</h2>
<ul>
<li><strong>Open Source &amp; Kostenlos</strong></li>
<li><strong>Leichtgewichtig</strong>. In Version 1.4.13 benötigt der Lighty nicht mehr als 2Mb RSS auf einem VPS. Ein einzelner Prozess erledigt alles, selbst wenn 100 Connections eingehen.</li>
<li><strong>Geschwindigkeit</strong>. Die Auslieferung von statischen Dateien geschieht mit einer unglaublichen Geschwindigkeit. Das FastCGI und das Proxy Serving ist ebenfalls rasant schnell.</li>
<li><strong>Module</strong>. Es gibt gefühlt unendlich viele Module mit einer guten Dokumentation.</li>
<li><strong>Mod_magnet</strong> ist eine Scripting Engine direkt im Webserver. Das Modul integriert Lua in lighttpd.</li>
<li><strong>Community</strong>. Einen Blog, ein Wiki/bug tracker und ein Forum. Hier findet man immer Hilfe</li>
</ul>
<p>&nbsp;</p>
<p><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Nachteile</span></p>
<ul>
<li><strong>Geringe Stabilität</strong> gerade was HTTPS+Proxy in Kombination mit Python oder Ruby angeht.</li>
<li><strong>Kein Mod_rewrite</strong>. Die Built-in rewriting engine ist Schrott, und das Portieren der Apache mod_rewrite Regeln ist nicht ganz einfach.</li>
<li><strong>Memory leaks</strong>. Und diese wurden seither nicht gefixed.</li>
<li>Die <strong>Entwicklung</strong> läuft vergleichsweise <strong>langsam</strong>.</li>
</ul>
<p>&nbsp;</p>
<h1>Nginx</h1>
<h2>Vorteile</h2>
<ul>
<li><strong>Open Source &amp; Kostenlos</strong></li>
<li><strong>Leichtgewichtig</strong>. Zwar nicht ganz so leicht wie der Lighty, aber dennoch nicht so Ressourcenhungrig wie der Apache.</li>
<li><strong>Schnell</strong>. Einie benchmarks haben gezeigt, dass Nginx deutlich schneller ist als der Lighty und der Apache. Gerade was die Auslieferung von statischen Inhalten angeht.</li>
<li><strong>Module</strong>. Ähnlich wie bei den beiden anderen Kontrahenten gibt es auch hier mehr Module als man benötigt. Während Lighttpd eine Lua scripting engine besitzt, kann man den Nginx mit dem Perl Interpreter aufmotzen.</li>
<li><strong>Besseres Rewrite Modul</strong>. Ein sehr viel besseres Rewrite Modul als Lighttpd mit komplexen Bedinungen. Das Portieren von mod_rewrite Regeln vom Apache ist vergleichsweise einfach.</li>
<li><strong>Stabil</strong> und keine leaks. Keine Probleme bekannt.</li>
<li>Sehr <strong>schnelle Entwicklung</strong>: Es gibt fast monatlich Updates</li>
<li>Die <strong>Konfiguration</strong> ist <strong>einfach</strong> und übersichtlich.</li>
</ul>
<h2>Nachteile</h2>
<ul>
<li><strong>Kleine Community</strong>. Es gibt einen IRC und ein Wiki. Dann wirds auch schon eng.</li>
<li>Nginx kann <strong>keine FastCGI Prozesse</strong> erstellen. Das muss dann über einen externen fcgi spawner geschehen.</li>
</ul>
<p>&nbsp;</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span></p>
<p>Der Lighttpd kam bei mir eigentlich nie wirklich in Frage. Das hatte zwei Gründe:</p>
<ol>
<li>Ist die Konfiguration wirklich hässlich <img src='http://blog.itws.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Sorry aber ich bin da etwas sensibel.</li>
<li>Weil der Lighttpd ein paar Memory Leaks hat, die seit Jahren nicht gefixt werden.</li>
<li>Hatte ich mir bereits vor längerer Zeit die Rewrite Rules vom Lighty angesehen &#8211; eher durch Zufall darauf gestoßen und dann aus Neugierde recheriert &#8211; das hat mich direkt abgeschreckt.</li>
</ol>
<p>Also fällt auf meine Wahl auf den hochangepriesenen Nginx Proxy-/WebServer, mit dem mittlerweile rund 7% des World Wide Webs betrieben werden. Darunter high-visibility Platformen wie <a href="http://wordpress.com" target="_blank">WordPress.com</a>, <a href="http://github.com" target="_blank">Github</a>, <a href="http://www.ohloh.net/" target="_blank">Ohloh</a>, <a href="sourceforge.net" target="_blank">SourceForge</a>, <a href="http://www.golem.de/" target="_blank">Golem.de</a> uvm. Außerdem verspricht dieser nicht nur mehr Performance sondern auch eine einfachere Konfiguration.</p>
<p>Auch wenn mich der Part mit dem FastCGI Prozessen etwas nerven wird. Mal sehen vielleicht finde ich dafür ja noch eine saubere Lösung.</p>
<p>&nbsp;</p>
<h1>Anforderungen</h1>
<p>Ich habe natürlich einige Anforderungen an den Webserver. Damit ich meinen Server migrieren kann, benötige ich folgende Funktionen:</p>
<ul>
<li>RewriteRules für .htaccess files</li>
<li>Basic Authentication</li>
<li>Virtuelle Hosts</li>
<li>PHP</li>
<li>Einen Proxy um den Java Webserver dahinter anzubinden</li>
</ul>
<p>Nginx ist nicht nur ein Webserver sondern auch ein POP3/IMAP-Proxy und ein reverse Proxy. Letzteres Problem war also schonmal gar kein Thema weil der Server einfach exakt für solche Dinge designed wurde. Auch Mongrel lässt sich sehr sehr gut mit Nginx betreiben, wie ich gelesen habe.</p>
<p>PHP lässt sich über FastCGI anbinden, was deutlich performanter ist als mod_php für den Apachen, da PHP somit nicht bei jedem Request mitgestartet wird. Was mir hier noch etwas Sorgen bereitet, ist das nicht vorhandene Feature vom Nginx, FastCGI Prozesse zu starten. Glücklichwerweise bringt PHP5 einen eigenen FastCGI Prozess Manager mit sich: PHP-FPM. Das erleichtert die Anbindung von PHP ungemein.</p>
<p>Virtuelle Hosts, Basic Authtentication und RewriteRules sind für moderne Webserver ohnehin bereits Standardumfang. Und die Rewrite Rules von Nginx sehen sogar ganz brauchbar aus (wenn es um das Portieren von  mod_rewrite Regeln geht). Sollte also alles kein Thema sein.</p>
<p>Bleibt noch eine kleine Anforderung: Die Verzeichnis-Struktur. Meine bisherige Verzeichnis-Struktur sieht wie folgt aus:</p>
<p><em>/var/www/hostname/subdomain/</em></p>
<p>Entsprechend gibt es folgende Verzeichnisse:</p>
<ul>
<li><em>/var/www/itws.de/blog</em></li>
<li><em>/var/www/itws.de/ci</em></li>
<li><em>/var/www/yaana.de/www</em></li>
<li><em>/var/www/yaana.de/blog</em></li>
</ul>
<p>Und einige mehr.</p>
<p>Diese Struktur will ich natürlich beibehalten. Es hätte mich nun gewundert, wenn das nicht gehen würde. Nach kurzer Recherche, war ich mir sicher, dass das kein Thema sein wird.</p>
<p>&nbsp;</p>
<p>Es kann also los gehen.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/" title="Debian: Von Apache zu Nginx &#8211; Teil 3: PHP">Debian: Von Apache zu Nginx &#8211; Teil 3: PHP</a></li><li><a href="http://blog.itws.de/767/debian-von-apache-zu-nginx-teil-4-einen-tomcat-anbinden/" title="Debian: Von Apache zu Nginx &#8211; Teil 4: Einen Tomcat anbinden">Debian: Von Apache zu Nginx &#8211; Teil 4: Einen Tomcat anbinden</a></li><li><a href="http://blog.itws.de/754/debian-von-apache-zu-nginx-teil-2-installation-und-konfiguration/" title="Debian: Von Apache zu Nginx &#8211; Teil 2: Installation und Konfiguration">Debian: Von Apache zu Nginx &#8211; Teil 2: Installation und Konfiguration</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=747&amp;md5=8201e70428a2058e9de81809355a6725" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/747/debian-von-apache-zu-nginx-teil-1-vorwort/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Schei? Encoding &#8230;</title>
		<link>http://blog.itws.de/672/schei-encoding/</link>
		<comments>http://blog.itws.de/672/schei-encoding/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 09:53:03 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[encoding]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=672</guid>
		<description><![CDATA[Es gab in meinem Leben bisher nichts, womit ich so viel Zeit verschwendet habe wie mit Encoding Problemen. Für mein aktuelles Projekt entwickle ich zur Zeit einen crawler, der Websites zieht und analysiert. Natürlich bin ich da direkt auf sämtliche Encoding-Problemchen gestoßen, die man sich nur vorstellen kann und hatte unglaublich viel Spaß damit &#8230; Ich verwende das Zend Framework und daher entsprechend die Klasse Zend_Http_Client um die HTTP-Requests abzusetzen. Danach suche ich den Inhalt [...]]]></description>
			<content:encoded><![CDATA[<p>Es gab in meinem Leben bisher nichts, womit ich so viel Zeit verschwendet habe wie mit Encoding Problemen.</p>
<p>Für mein aktuelles Projekt entwickle ich zur Zeit einen crawler, der Websites zieht und analysiert. Natürlich bin ich da direkt auf sämtliche Encoding-Problemchen gestoßen, die man sich nur vorstellen kann und hatte unglaublich viel Spaß damit &#8230;</p>
<p>Ich verwende das Zend Framework und daher entsprechend die Klasse Zend_Http_Client um die HTTP-Requests abzusetzen.<br />
Danach suche ich den Inhalt der Seite raus, sodass lediglich ein String ohne HTML-Tags und damit reinem Text übrig bleibt.<br />
Gebe ich mir diesen nun einfach auf die Shell aus, stimmt das Encoding manchmal und manchmal nicht. Das sieht man dann immer schön an den kaputten Umlauten.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Also habe ich eine Funktion gebraucht, die das Encoding eines Strings konvertiert &#8230; Tja, wenn es denn so einfach wäre &#8230;<br />
Die letzten Tage habe ich rund 20 Stunden damit verbracht eine Funktion zu schreiben, welche dafür sorgt, dass der String, der am Ende rauskommt, sauber dargestellt wird &#8211; unabhängig davon, was rein kommt. Das Problem hier war in erster Linie, dass selbst Strings, die sich als UTF-8 ausgegeben haben und von denen sogar mb_check_encoding() behauptet hat, es sei alles in bester Ordnung, haben kaputte Umlaute mit sich getragen. Also darauf konnte man sich schonmal gar nicht verlassen.</p>
<p>Ich möchte hier das Ergebnis meiner Arbeit mit euch teilen. Nicht erschrecken, es ist keine saubere Lösung (die sauberen Implementierungen haben allesamt nicht funktioniert). Der Code deckt auch nicht alle denkbaren Fälle ab, aber ich konnte bisher jeden beliebigen kaputten String mit deutschem Text und explodierten Umlauten in einen lesbaren String mit intakten Umlauten konvertieren. Da das mehrere 100 Texte aus verschiedensten Quellen aus dem Netz waren, behaupte ich mal, dass der Code recht brauchbar ist. Im Zweifelsfall dient er als gute Basis für eine umfassendere Implementierung.</p>
<p>Der Methode magicFixStringEncoding() kann man also einen beliebigen  String übergeben unabhängig davon ob er völlig in Ordnung ist oder total verstümmelt. Die Rückgabe der Methode sollte immer einen sauberen String mit funktionierenden Umlauten entsprechen.</p>
<p>Für Verbesserungsvorschläge bin ich jeder Zeit offen. Annsonsten viel Spaß denen, die den Code gebrauchen können <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre class="php">class ITWS_Tool {
	public static function magicFixStringEncoding($strInput) {
		if (preg_match('/[üäöÄÖÜß]/i', $strInput) === 1) {
			$strInput = self::convertEncoding($strInput, 'UTF-8');

			if (strlen(utf8_decode($strInput)) !== strlen(utf8_decode(utf8_decode($strInput)))) {
				$strInput = utf8_decode($strInput);
			}
		} else {
			$strInput = self::convertEncoding($strInput, 'UTF-8', 'ISO-8859-15');
		}

        return $strInput;
    }

    public static function convertEncoding($strInput, $toEncoding, $fromEncoding = '') {
        if ($fromEncoding == '') {
            $fromEncoding = mb_detect_encoding($strInput, array('UTF-8', 'ASCII', 'ISO-8859-1', 'JIS', 'EUC-JP', 'SJIS'), true);
		}

        if ($fromEncoding == $toEncoding) {
            return $strInput;
		}

        return mb_convert_encoding($strInput, $toEncoding, $fromEncoding);
    }
}</pre>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/" title="PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse">PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse</a></li><li><a href="http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/" title="Den Horizont erweitern: Das Zend Framework">Den Horizont erweitern: Das Zend Framework</a></li><li><a href="http://blog.itws.de/212/php-der-include-path/" title="[PHP] Der include path">[PHP] Der include path</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=672&amp;md5=c43b9f2824a457050498b8fd089b6856" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/672/schei-encoding/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mein Umstieg von Eclipse PDT auf Netbeans</title>
		<link>http://blog.itws.de/668/mein-umstieg-von-eclipse-pdt-auf-netbeans/</link>
		<comments>http://blog.itws.de/668/mein-umstieg-von-eclipse-pdt-auf-netbeans/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 11:45:36 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[tools]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[pdt]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=668</guid>
		<description><![CDATA[Da ich in letzter Zeit zunehmends von Eclipse genervt bin (bzw. eigentlich allem, was mit Java zu tun hat, weils einfach der letzte Mist ist), habe ich mal netbeans nochmal angetestet. Zu verlieren hatte ich ja nichts, Eclipse war schließlich eben zum 5. mal heute abgestürzt und mir hat einfach die Motivation gefehlt es wieder zu starten. Netbeans hatte ich vor zwei Jahren schonmal ausprobiert, war da aber von dem Layout der Benutzeroberfläche wenig begeistert [...]]]></description>
			<content:encoded><![CDATA[<p>Da ich in letzter Zeit zunehmends von Eclipse genervt bin (bzw. eigentlich allem, was mit Java zu tun hat, weils einfach der letzte Mist ist), habe ich mal netbeans nochmal angetestet. Zu verlieren hatte ich ja nichts, Eclipse war schließlich eben zum 5. mal heute abgestürzt und mir hat einfach die Motivation gefehlt es wieder zu starten.</p>
<p>Netbeans hatte ich vor zwei Jahren schonmal ausprobiert, war da aber von dem Layout der Benutzeroberfläche wenig begeistert &#8211; um nicht zu sagen, sie war hässlich. Das hat sich mittlerweile geändert. Fein.</p>
<p>Positiv beeindruckt hat mich erstmal die Tatsache, dass es ein Git Plugin gab. Dabei sollte es aber nicht bleiben, denn das importiere Projekt hat er direkt als Git Projekt und als Zend Framework Projekt erkannt. Abgefahren. Eclipse wusste das nichtmal nachdem ich es ihm klar gemacht habe. Egal. Ich habe alle Konfig-Einstellungen, die ich benötigt habe auch direkt gefunden. Super.</p>
<p>Besonders gefällt mir aber die Performance. Macht richtig Spaß damit zu arbeite, wenn man Eclipse gewohnt ist. Bis die JVM das zweit mal abgeraucht ist, habe ich etwas rumgespielt. Danach war ich von Java wieder so genervt, dass ich keine Lust mehr hatte.  Dennoch bin ich von Netbeans bisher beeindruckt. Die IDE bietet also durchaus das Potential Eclipse PDT als preferierte PHP IDE abzulösen.</p>
<p>Nur hoffen, dass Oracle endlich mal ein wenig an der Stabilität der JVM arbeitet, denn so macht das echt keinen Spaß. Aber was will man von Java auch anderes erwarten <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>over and out</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/815/zend-framework-resourcen/" title="Zend Framework Resourcen">Zend Framework Resourcen</a></li><li><a href="http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/" title="Debian: Von Apache zu Nginx &#8211; Teil 3: PHP">Debian: Von Apache zu Nginx &#8211; Teil 3: PHP</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=668&amp;md5=a0a0870908a31ca55bbdb370cd05c728" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/668/mein-umstieg-von-eclipse-pdt-auf-netbeans/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse</title>
		<link>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/</link>
		<comments>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 20:11:34 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php 5.4]]></category>
		<category><![CDATA[trait]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=578</guid>
		<description><![CDATA[Im nächsten PHP Release gibt es ein neues Feature für horizontalen Code Reuse: sog. Traits (engl. Merkmal, Charakterzug). Was das ist und wie es funktioniert, erfahrt ihr im folgenden Artikel. Vererbung: Vertikaler Code Reuse class A { public function foo() { ....} } class B extends A { } Bei der objektorientierten Vererbung werden alle nicht-privaten Methoden und Attribute einer Klasse auf die Kind-Klasse vererbt. Das ist toll, denn so braucht man viele Methoden nur [...]]]></description>
			<content:encoded><![CDATA[<p>Im nächsten PHP Release gibt es ein neues Feature für horizontalen Code Reuse: sog. Traits (engl. Merkmal, Charakterzug). Was das ist und wie es funktioniert, erfahrt ihr im folgenden Artikel.</p>
<h2>Vererbung: Vertikaler Code Reuse</h2>
<pre class="php">class A {
	public function foo() { ....}
}

class B extends A { }</pre>
<p>Bei der objektorientierten Vererbung werden alle nicht-privaten Methoden und Attribute einer Klasse auf die Kind-Klasse vererbt. Das ist toll, denn so braucht man viele Methoden nur einmal zu implementieren, kann sie aber in vielen verschiedenen Klassen wiederverwenden. Das ist vertikaler Code Reuse. Tolle Sache, kein Thema.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Dennoch gab es ein paar Dinge, die sich mit einfacher Vererbung nicht umsetzen ließen. z.B. eine Basis-Klasse für das Singleton-Pattern. Gerade in PHP ist das Hauptproblem hier, dass keine Mehrfach-Vererbung möglich ist &#8211; also eine Klasse nicht von mehr als einer anderen Klasse abgeleitet werden kann. Das zwingt uns leider oft dazu, dass wir uns der unangehmen Entscheidung stellen müssen, ob wir nun konzeptionell sauberen Code oder aber möglichst gute Wiederverwendung von Code haben wollen. Um dennoch irgenwie horizontalen Code Reuse zu realisieren mussten Methoden kopiert werden (also praktisch kein Reuse) oder Methoden bis in die Wurzel der Klassen-Hierarchie geschoben werden, was alles andere als schön ist.</p>
<p><span id="more-578"></span></p>
<h2>Traits: Horizontaler Code Reuse</h2>
<p>Abhilfe schaffen hier in PHP 5.4 die sogenannten Traits, welche bereits in Perl 6 oder Scala zur Verfügung stehen. Sie erlauben es dem Entwickler Behaviors (also Verhalten) in Code zu gießen. Diese Traits funktionieren im Prinzip wie Klassen können jedoch &#8211; ähnlich wie Interfaces und abstrakte Klassen &#8211; nicht instanziiert werden.</p>
<p>Sie sind dazu gedacht, Funktionalitäten zu gruppieren. Einer der Vorteile ist, dass eine Klasse mehrere Traits verwenden kann. Traits beheben somit einige Probleme von <em>single inheritance</em> Sprachen wie PHP oder Java.</p>
<p>Um das eben angesprochene Singleton-Pattern-Problem zu lösen genügt nun ab PHP 5.4 folgene Klassen-Definition:</p>
<p>&nbsp;</p>
<pre class="php">trait Singleton {
    public static function getInstance() { ... }
}

class A {
    use Singleton;
    // ...
}

class B extends ArrayObject {
    use Singleton;
    // ...
}

// Beide Klassen verwenden nun das Singleton Trait und implementieren somit das Singleton-Pattern:
A::getInstance();
B::getInstance();</pre>
<p>&nbsp;</p>
<p>Es wird noch besser: Wie bereits erwähnt, kann eine Klasse kann beliebig viele Traits verwenden. Da stellt sich der aufgeweckte Coder natürlich die Frage:</p>
<p>&nbsp;</p>
<h1>Was passiert bei Konflikten?</h1>
<p>Sprich: Was passiert, wenn zwei Traits verwenden werden, die beide eine Methode mit der selben Signatur definieren?</p>
<pre class="php">trait A {
    public function foo() {
        echo 'a';
    }

    public function bar() {
        echo 'A';
    }
}

trait B {
    public function foo() {
        echo 'b';
    }

    public function bar() {
        echo 'B';
    }
}

class C {
    use A, B;
}</pre>
<p>Dazu ist folgeneds zu sagen: Traits werden bereits in einigen Sprachen verwendet und es hat sich gezeigt, dass Konflikte zwar auftreten aber das eher die Ausnahme darstellt. Dennoch muss es natürlich ein definiertes Verhalten geben, das vorschreibt, was passieren soll, wenn Konflikte auftreten.</p>
<p>Diese Konfliktlösung sieht hier wie folgt aus:</p>
<p>Erstmal wirft PHP eine Warning um dem Entwickler darauf aufmerksam zu machen, dass ein Konflikt aufgetreten ist. Und gibt dazu auch die Info, wo der Konflikt genau auftritt. In dem Fall würde es die beiden Methoden <em><strong>foo()</strong></em> und <em><strong>bar()</strong></em> melden.</p>
<p>Und das ist auch gut so, denn <strong>keine</strong> der beiden Methoden werden in Klasse C zur Verfügung stehen! Richtig, die Konfliktlösung sieht vor, dass alles, was einen Konflikt erzeugt, rausfliegt.</p>
<p>PHP zwingt uns damit, die Traits ordentlich zu verwenden und PHP zu sagen, was wir aus welchem Trait haben wollen:</p>
<pre class="php">class C {
    use A, B {
        B::foo instead A;
        A::bar instead B;
    }
}
?&gt;</pre>
<p>Dieser Code bewirkt folgendes Verhalten: Klasse <strong><em>C</em></strong> erhält aus Trait <strong><em>B</em></strong> die Methode <em><strong>foo()</strong></em> und aus Trait <em><strong>A</strong></em> die Methode <em><strong>bar()</strong></em>.<br />
Entsprechend würde ein Aufruf der beiden Methoden auf Klasse <strong><em>C</em></strong> &#8220;<em>b</em>&#8221; und &#8220;<em>A</em>&#8221; ausgeben.</p>
<p>Das ist zwar cool, aber dennoch nicht die sauberste Lösung. Es gibt Alternativen: So kann der Entwickler auch Aliase vergeben:</p>
<pre class="php">class C {
    use A, B {
        B::foo instead A;
        A::bar instead B;
        B::bar as bar2;
    }
}</pre>
<p>Ok, ich gebe zu, dass sich die Beispiele jetzt nicht gerade durch Kreativität auszeichen, aber solange man erkennen kann um was es geht, reicht das <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Klasse <em><strong>C</strong></em> würde nach diesem Beispiel nun zusätzlich eine Methode <em><strong>bar2()</strong></em> besitzen, welche der <em><strong>bar()</strong></em>-Methode von Trait <em><strong>B</strong></em> entspricht.</p>
<p>&nbsp;</p>
<h1>Fazit</h1>
<p>Kombiniert man die OOP und ihre Features (Vererbung, Interfaces, Namespaces, Kapselung) nun mit den Traits kann man problemlos PHP-Anwendungen implementieren, die streng dem DRY-Prinzip folgen und gleichzeitg eine konzeptionell saubere Klassen-Hierarchie besitzen.</p>
<p>&nbsp;</p>
<p>Es gibt hierzu noch ein wenig mehr zu sagen, aber das ist erstmal das Wichtigste. Alles Weitere kann ich gerne noch in einen zweiten Artikel erklären <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>over and out</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/672/schei-encoding/" title="Schei? Encoding &#8230;">Schei? Encoding &#8230;</a></li><li><a href="http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/" title="Den Horizont erweitern: Das Zend Framework">Den Horizont erweitern: Das Zend Framework</a></li><li><a href="http://blog.itws.de/212/php-der-include-path/" title="[PHP] Der include path">[PHP] Der include path</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=578&amp;md5=49586e9b9cebc5bfe7c824ef91112b54" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Und da ist es: Ein brauchbares PMS!</title>
		<link>http://blog.itws.de/394/und-da-ist-es-ein-brauchbares-pms/</link>
		<comments>http://blog.itws.de/394/und-da-ist-es-ein-brauchbares-pms/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 20:51:54 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[tools]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[bugtracking]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pms]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=394</guid>
		<description><![CDATA[In einem meiner letzten Beitr&#228;ge habe ich mich dar&#252;ber ausgelassen, dass es keine brauchbaren OpenSource Project Management Systeme gibt und beschrieben, dass ich mich bis dahin erstmal mit Trac zufrieden gebe auch wenn es mich nicht wirklich gl&#252;cklich gemacht hat. Und heute habe ich dann The Bug Genie entdeckt und war sofort beeindruckt: Das Bug Tracking und Project Management System bietet eine ganze Menge an wirklich sorgf&#228;lltig implementierten Features (dazu weiter unten mehr) und das [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.itws.de/wp-content/uploads/2011/02/1297169381_stock_task.png"><img alt="" class="alignleft size-full wp-image-392" height="128" src="http://blog.itws.de/wp-content/uploads/2011/02/1297169381_stock_task.png" title="tasks" width="128" /></a>In <a href="http://blog.itws.de/391/brauchbare-project-management-systeme-sind-mangelware/" target="_blank">einem meiner letzten Beitr&auml;ge</a> habe ich mich dar&uuml;ber ausgelassen, dass es keine brauchbaren OpenSource Project Management Systeme gibt und beschrieben, dass ich mich bis dahin erstmal mit Trac zufrieden gebe auch wenn es mich nicht wirklich gl&uuml;cklich gemacht hat.</p>
<p>Und heute habe ich dann <a href="http://thebuggenie.com/index.php" target="_blank">The Bug Genie</a> entdeckt und war sofort beeindruckt: Das Bug Tracking und Project Management System bietet eine ganze Menge an wirklich sorgf&auml;lltig implementierten Features (dazu weiter unten mehr) und das ganz ohne das System unn&ouml;tig kompliziert zu gestalten. Das Open Source Projekt ist in PHP 5.3 entwickelt und nutzt alle modernen M&ouml;glichkeiten um eine wirklich sehr angenehme GUI-Erfahrung zu bieten.<span id="more-394"></span></p>
<p>Interessant sind vor Allem auch die Features, die es dem Admin erlauben Teams und Workflows (wie sieht der Ablauf aus, mit dem ein Ticket bearbeitet wird?) zu definieren.</p>
<p>Hier ein kleiner Auszug aus der <a href="http://thebuggenie.com/features.php" target="_blank">Featureliste von TGB</a>.</p>
<ul>
<li>Verwaltung von Projeten, Gruppen, Teams, Benutzern und Issues</li>
<li>Definition von Workflows, Issue Fields und Issue Types</li>
<li>Wiki</li>
<li>VCS-Integration</li>
<li>Agile development</li>
<li>uvm.</li>
</ul>
<p>Eine Detailierte Liste gibt es <a href="http://thebuggenie.com/features.php" target="_blank">hier</a>.</p>
<p>Einziger Nachteil ist die fehlende deutsche &Uuml;bersetzung, aber das ist nur eine Frage der Zeit.</p>
<p>&Uuml;brigens: Im TBG Developer Blog kann man die Entwicklung des Projekts beobachten.</p>
<p>Das System ist also auf jeden Fall einen Blick wert, wenn jemand ein gutes Project Management System und/oder Bug Tracking System sucht. Die Installation ist eine Sache von wenigen Minuten und auch die Konfiguration des Systems geht dank der sehr benutzerfreundlichen GUI sehr gut von der Hand.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/815/zend-framework-resourcen/" title="Zend Framework Resourcen">Zend Framework Resourcen</a></li><li><a href="http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/" title="Debian: Von Apache zu Nginx &#8211; Teil 3: PHP">Debian: Von Apache zu Nginx &#8211; Teil 3: PHP</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=394&amp;md5=472da782f22b1187adba4dce1451d8c7" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/394/und-da-ist-es-ein-brauchbares-pms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Den Horizont erweitern: Das Zend Framework</title>
		<link>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/</link>
		<comments>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 08:51:20 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[projekte]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=387</guid>
		<description><![CDATA[Gestern war ich auf der Suche nach einem neuen geeigneten Framework für ein Projekt (bisher Codeigniter verwendet, aber das hat nie so ganz meinen Bedürfnissen entsprochen). Nach dem ich nochmal auf die Websites von codeigniter 2.0, cakePHP, akelos etc. gesurft bin und jeweils einen Blick reingeworfen habe, habe ich beschlossen mich mal von meinem Vorurteilen zu befreien und mir das Zend Framework anzusehen. Vor diesem Framework habe ich mich lange Zeit zurückschrecken lassen, da ich [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern war ich auf der Suche nach einem neuen geeigneten Framework für ein Projekt (bisher Codeigniter verwendet, aber das hat nie so ganz meinen Bedürfnissen entsprochen). Nach dem ich nochmal auf die Websites von codeigniter 2.0, cakePHP, akelos etc. gesurft bin und jeweils einen Blick reingeworfen habe, habe ich beschlossen mich mal von meinem Vorurteilen zu befreien und mir das Zend Framework anzusehen.</p>
<p>Vor diesem Framework habe ich mich lange Zeit zurückschrecken lassen, da ich der Ansicht war, dass das nur ein Haufen sinnlos zusammengestückelter PHP Files ist und das praktische Arbeiten mit dem ZF nicht besser aussieht.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Aber man muss auch mal über seinen Horizont hinausblicken, weswegen ich mir mal die Dokumentation des Frameworks angesehen habe. Erst auf deutsch. Dann auf englisch, weil die Übersetzung so schlecht ist, dass ich viele Sätze fünfmal lesen musste, bis ich sie verstanden habe <img src='http://blog.itws.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
Den Quickstart Guide fand ich bis zu einem gewissen Punkt sehr gut, dann wurd es aber sehr schwammig und viele wichtige Punkte haben gefehlt, weswegen ich den Guide an dieser Stelle verlassen habe und beschlossen habe die Dokumentation zu lesen. Auf englisch natürlich. Die Doku ist soweit also nicht ideal aber auch nicht ausgesprochen schlecht.</p>
<p>Das Framework an sich ist deutlisch komfortabler als ich dachte, das autoloading erspart viel Arbeit und die saubere objektorientierte Implementierung der Komponenten ist wirklich gut.</p>
<p>Bisher sieht es also ganz danach aus, als würde ich das anstehende Projekt mit dem Zend Framework umsetzen. Das hat verschiedene Konsequenzen. Zu erstmal bin ich froh, diesen Schritt getan zu haben und mich endlich mit dem Framework zu befassen. Zum Anderen wird mir das wohl auch einiges an Stoff liefern, über den ich hier im Blog schreiben kann und zum anderen kann ich endlich mal wieder ein Projekt starten und habe was zum coden. Wurde auch mal wieder Zeit.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/815/zend-framework-resourcen/" title="Zend Framework Resourcen">Zend Framework Resourcen</a></li><li><a href="http://blog.itws.de/672/schei-encoding/" title="Schei? Encoding &#8230;">Schei? Encoding &#8230;</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=387&amp;md5=05ebcf0b623d50bb2eb6b72c225a1860" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Vor- und Nachteile von PHP</title>
		<link>http://blog.itws.de/331/die-vor-und-nachteile-von-php/</link>
		<comments>http://blog.itws.de/331/die-vor-und-nachteile-von-php/#comments</comments>
		<pubDate>Thu, 25 Nov 2010 12:36:53 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=331</guid>
		<description><![CDATA[Angeregt durch den Artikel Die &#34;Vor- und Nachteile von PHP&#34; auf entwickler.de, m&#246;chte ich eine bestimmte Aussage hier nochmal aufgreifen und am Ende meine leicht provokante Meinung dazu abgeben. Dennis Becker gab folgendes Kommentar zu dem besagten Artikel auf entwickler.de ab: &#160; &#160; &#160; PHP hat einen gro&#223;en Nachteil: der Zwang, abw&#228;rtskompatibel zu bleiben. In Ruby &#38; Python sehen ich gleich gute Alternativen, besser w&#252;rde ich aber nicht sagen. PHPs Problem liegt einfach in der [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.itws.de/wp-content/uploads/2010/11/php.jpg"><img alt="" class="alignnone size-thumbnail wp-image-334" src="http://blog.itws.de/wp-content/uploads/2010/11/php-150x150.jpg" style="float: left; width: 150px; height: 150px; " title="php" /></a>Angeregt durch den Artikel Die &quot;<a href="http://entwickler.de/zonen/portale/psecom,id,99,news,57607.html" target="_blank">Vor- und Nachteile von PHP</a>&quot; auf <a href="http://entwickler.de" target="_blank">entwickler.de</a>, m&ouml;chte ich eine bestimmte Aussage hier nochmal aufgreifen und am Ende meine leicht provokante Meinung dazu abgeben.</p>
<p>Dennis Becker gab folgendes Kommentar zu dem besagten Artikel auf entwickler.de ab:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>
	<meta content="text/html; charset=utf-8" http-equiv="content-type" /></p>
<blockquote>
<p>PHP hat einen gro&szlig;en Nachteil: der Zwang, abw&auml;rtskompatibel zu bleiben. In Ruby &amp; Python sehen ich gleich gute Alternativen, besser w&uuml;rde ich aber nicht sagen. PHPs Problem liegt einfach in der Vergangenheit und f&uuml;r die ursp&uuml;rngliche Kernaufgabe, f&uuml;r die es entwickelt wurde: Form Handling und Database Communication. Ruby &amp; Python wurden von Anfang an mit einem viel gr&ouml;&szlig;eren Scope entwickelt!</p>
</blockquote>
<p><span id="more-331"></span></p>
<p>Meiner Meinung nach ist das der springende Punkt: Eine Anforderung an PHP ist die Abw&auml;rtskompatibilit&auml;t und genau das ist auch eine Schw&auml;che, da hier nicht nur Altlasten existieren sondern auch einige Konzepte wie eine etwas st&auml;rkere Typisierung etc. nur schwer umzusetzen sind. Dass Ruby und Python oft als bessere Sprachen angepriesen werden, liegt daran, dass diese mit anderen Anforderungen entwickelt wurden.</p>
<p>Meiner Meinung nach, w&auml;re ein Fork von PHP mal ne wirklich coole Sache. In diesem Fork k&ouml;nnte man st&auml;rkere Typisierung implementieren, die OOP von PHP etwas ausweiten, die ganze Altlast entfernen und in der API durchgehend f&uuml;r Konsistenz sorgen und &#8211; &auml;hnlich wie Ruby und Pyhton &#8211; k&ouml;nnte man auf einem ganz anderern Niveau ansetzen als PHP damals in seiner ersten Version. Das klingt nun etwas Wahnsinnig, aber eine solcher Fork h&auml;tte durchaus das Potential die aktuellen Favoriten in Sachen Scriptsprachen abzul&ouml;sen. Vorausgesetzt man l&auml;sst die Erfahrungen aus Ruby, Python und PHP 5.3 einfliesen und l&auml;sst die historisch-bedingten Aspekte der Sprache entfallen.</p>
<p>Ich w&uuml;rde es ja selbst machen, mir fehlt nur leider die Zeit <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>So, das reicht an verr&uuml;ckten Behauptungen f&uuml;r einen Tag &#8230;</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/815/zend-framework-resourcen/" title="Zend Framework Resourcen">Zend Framework Resourcen</a></li><li><a href="http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/" title="Debian: Von Apache zu Nginx &#8211; Teil 3: PHP">Debian: Von Apache zu Nginx &#8211; Teil 3: PHP</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=331&amp;md5=4b52e82cb3b3032a22ae588bf431fcff" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/331/die-vor-und-nachteile-von-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

