<?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>Web-Rocker</title> <atom:link href="http://web-rocker.de/feed/" rel="self" type="application/rss+xml" /><link>http://web-rocker.de</link> <description>Writes About PHP, Zend Framework, RAILS And Performance</description> <lastBuildDate>Fri, 11 Jan 2013 10:14:47 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.2</generator> <item><title>GIT Cheat-Scheets</title><link>http://web-rocker.de/2012/05/git-cheat-scheets/</link> <comments>http://web-rocker.de/2012/05/git-cheat-scheets/#comments</comments> <pubDate>Sun, 20 May 2012 09:16:29 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Versionsverwaltung]]></category> <category><![CDATA[cheatsheet]]></category> <category><![CDATA[git]]></category> <category><![CDATA[repository]]></category> <category><![CDATA[svn]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=426</guid> <description><![CDATA[Für Umsteiger von Subversion auf GIT ist es manchmal ganz hilfreich einen kleinen Zettel auf dem Schreibtisch liegen zu haben, der die nötigsten Befehle bereithält. Ich habe deshalb einen Liste mit sogenannten GIT Cheat-Sheets zusammengestellt, da sollte für jeden Geschmack etwas dabei sein. Hilfreich ist natürlich auch das Buch &#8220;Versionskontrolle mit Git&#8221; aus dem O&#8217;Reilly &#8230; <a
href="http://web-rocker.de/2012/05/git-cheat-scheets/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><a
href="http://www.amazon.de/gp/product/389721945X/ref=as_li_tf_il?ie=UTF8&amp;tag=go-link-21&amp;linkCode=as2&amp;camp=1638&amp;creative=6742&amp;creativeASIN=389721945X"><img
class="alignleft" src="http://ws.assoc-amazon.de/widgets/q?_encoding=UTF8&amp;Format=_SL160_&amp;ASIN=389721945X&amp;MarketPlace=DE&amp;ID=AsinImage&amp;WS=1&amp;tag=go-link-21&amp;ServiceVersion=20070822" alt="" border="0" /></a><img
style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.de/e/ir?t=go-link-21&amp;l=as2&amp;o=3&amp;a=389721945X" alt="" width="1" height="1" border="0" /><br
/> Für Umsteiger von Subversion auf GIT ist es manchmal ganz hilfreich einen kleinen Zettel auf dem Schreibtisch liegen zu haben, der die nötigsten Befehle bereithält. Ich habe deshalb einen Liste mit sogenannten GIT Cheat-Sheets zusammengestellt, da sollte für jeden Geschmack etwas dabei sein. Hilfreich ist natürlich auch das Buch &#8220;Versionskontrolle mit Git&#8221; aus dem O&#8217;Reilly Verlag, wenn es darum geht die Vorteile der Dezentralität zu durchdringen oder ein bestehendes SVN Repository in ein neues GIT Repository zu integrieren.</p><p><span
id="more-426"></span></p><p>https://github.com/esc/git-cheatsheet-de/</p><p>http://github.com/AlexZeitler/gitcheatsheet</p><p>http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html</p><p>http://cheat.errtheblog.com/s/git/</p><p>http://www.xcombinator.com/2010/09/01/git-cheat-sheet-and-class-notes/</p><p>http://refcardz.dzone.com/refcardz/getting-started-git</p><p>http://www.cheatography.com/samcollett/cheat-sheets/git/</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2012/05/git-cheat-scheets/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>CloudControl cctrl lässt sich nicht auf Snow Leopard installieren</title><link>http://web-rocker.de/2011/05/cloudcontrol-cctrl-lasst-sich-nicht-auf-snow-leopard-installieren/</link> <comments>http://web-rocker.de/2011/05/cloudcontrol-cctrl-lasst-sich-nicht-auf-snow-leopard-installieren/#comments</comments> <pubDate>Sun, 01 May 2011 08:38:22 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Cloud]]></category> <category><![CDATA[cloudcontrol]]></category> <category><![CDATA[mac]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=409</guid> <description><![CDATA[Ich bin grade kläglich gescheitert, als ich die Kommandozeilen-Tools von CloudControl installieren wollte. Easy_install hat aus irgendeinem Grund probiert einige Python libs für die Architektur PPC zu kompillieren. sudo easy_install cctrl Die Fehlermeldung sieht dann so aus: Processing pycrypto-2.3.tar.gz Running pycrypto-2.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-a3AMTg/pycrypto-2.3/egg-dist-tmp-wqqPb7 warning: GMP library not found; Not building Crypto.PublicKey._fastmath. /usr/libexec/gcc/powerpc-apple-darwin10/4.2.1/as: assembler &#8230; <a
href="http://web-rocker.de/2011/05/cloudcontrol-cctrl-lasst-sich-nicht-auf-snow-leopard-installieren/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Ich bin grade kläglich gescheitert, als ich die Kommandozeilen-Tools von <a
href="http://www.cloudcontrol.de">CloudControl</a> installieren wollte. Easy_install hat aus irgendeinem Grund probiert einige Python libs für die Architektur PPC zu kompillieren.</p><p><code>sudo easy_install cctrl</code><br
/> Die Fehlermeldung sieht dann so aus:<br
/> <code>Processing pycrypto-2.3.tar.gz<br
/> Running pycrypto-2.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-a3AMTg/pycrypto-2.3/egg-dist-tmp-wqqPb7<br
/> warning: GMP library not found; Not building Crypto.PublicKey._fastmath.<br
/> /usr/libexec/gcc/powerpc-apple-darwin10/4.2.1/as: assembler (/usr/bin/../libexec/gcc/darwin/ppc/as or /usr/bin/../local/libexec/gcc/darwin/ppc/as) for architecture ppc not installed<br
/> Installed assemblers are:<br
/> /usr/bin/../libexec/gcc/darwin/x86_64/as for architecture x86_64<br
/> /usr/bin/../libexec/gcc/darwin/i386/as for architecture i386<br
/> src/MD2.c:134: fatal error: error writing to -: Broken pipe<br
/> compilation terminated.<br
/> lipo: can't open input file: /var/tmp//ccZdh65J.out (No such file or directory)<br
/> error: Setup script exited with error: command 'gcc-4.2' failed with exit status 1<br
/> </code></p><p>Abhilfe schafft hier das setzen einer Umgebungsvariable für den Compiler.<br
/> <code>sudo env ARCHFLAGS="-arch x86_64" easy_install cctrl</code></p><p>Nun läuft die Installation ohne weitere Probleme durch. Dieser Trick hilft auch beim Nachinstallieren von nativen Ruby GEMs oder PHP-Erweiterungen.</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/05/cloudcontrol-cctrl-lasst-sich-nicht-auf-snow-leopard-installieren/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>NAS &#8211; Falsche Sicherheit</title><link>http://web-rocker.de/2011/04/nas-falsche-sicherheit/</link> <comments>http://web-rocker.de/2011/04/nas-falsche-sicherheit/#comments</comments> <pubDate>Thu, 07 Apr 2011 07:41:13 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Server]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=401</guid> <description><![CDATA[Network attached storages oder kurz NAS sind in den letzten Jahren immer günstiger geworden und haben deshalb die Teamarbeit in kleinen Firmen, die Datensicherung oder das Archivieren sämtlicher Familienerinnerungen stark vereinfacht. Diese Geräte sind einfach, so das auch technisch nicht so versierte Menschen via Web-GUI innerhalb von Minuten ein paar CIFS-Freigaben erstellen können, auf denen &#8230; <a
href="http://web-rocker.de/2011/04/nas-falsche-sicherheit/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Network attached storages oder kurz <a
href="http://de.wikipedia.org/wiki/Network_Attached_Storage" target="_blank">NAS</a> sind in den letzten Jahren immer günstiger geworden und haben deshalb die Teamarbeit in kleinen Firmen, die Datensicherung oder das Archivieren sämtlicher Familienerinnerungen stark vereinfacht. Diese Geräte sind einfach, so das auch technisch nicht so versierte Menschen via Web-GUI innerhalb von Minuten ein paar CIFS-Freigaben erstellen können, auf denen dann im Laufe der Monate Terrabytes von mehr oder weniger wichtigen Daten gehortet werden. Die Daten sind ja sicher, immerhin ist es ein <a
href="http://de.wikipedia.org/wiki/RAID" target="_blank">RAID1</a> oder 5 oder X. Falls mal ein Platte ausfällt, einfach da wo es blinkt eine neue rein, ein paar Stunden warten und alles ist wieder sicher.</p><p>Nur wo ist jetzt der Harken?<span
id="more-401"></span> Leider ist es einfach so: Wenn sich etwas zu gut anhört um wahr zu sein – dann ist es auch nicht wahr. Warum wird eigentlich niemand stutzig, wenn man in den komfortablen Web-GUIs Optionen oder ganze Seiten zum Thema „Backup auf externe USB Datenträger“ findet? Besser wäre es, denn diese Geräte sind einfach nicht sicher. Sie weisen oft viele Schwachstellen auf, die sich frei nach <a
href="http://de.wikipedia.org/wiki/Murphys_Gesetz" target="_blank">Murphy’s Gesetz</a> zu einer Menge FUN. multiplizieren. Und damit meine ich einen „fucking unbelievable nightmare“.</p><p>Zum Beispiel die Hardware dieser Kisten. Software-RAID in Kombination mit billigem Labtop-Speicher ohne ECC Funktion. Ein Fehler im Arbeitsspeicher kann also dazu führen das Datenmüll auf die Platten geschrieben wird und das NAS es noch nicht einmal merkt. Ich weis es immer noch nicht genau, aber das ist im Prinzip die Geschichte eines guten Freundes der gestern Abend verzweifelt mit einem NAS bei mir auf der Matte stand.</p><p>Ich habe interessanterweise das selbe NAS deshalb wusste ich, das es sich um ein normales Linux Software-RAID handelte, auf dem <a
href="http://de.wikipedia.org/wiki/Logical_Volume_Manager" target="_blank">LVM2</a> mit ext2 Volumen rumhantiert. Also fix einen Server aufgestellt, Platten angesteckt, Ohrstöpsel rein und ein Linux booten. Der mdadm fand auf anhieb 3 RAID-Partitionen: Ein 2GB RAID1 mit 4 Volumen für die Firmware, ein 10GB RAID5 für whatever und die 750GB RAID5 für die eigentlichen Daten. Das Kommando bestätigte mir auch, das zwar die Volumen der Firmware nicht alle den Status „clean“ hatten, aber immerhin die eigentlichen Daten. Nur ließ sich das RAID5 Volumen nicht starten. Nach stundenlangem Googeln fand ich einen Blogpost eines Netgear-Technikers, der für solche Fälle vorschlägt das RAID bewusst mit einer fehlenden Platte zu starten, was auch funktionierte. Leider fand nun fdisk auf diesem Volumen keine Partitionen und auch der LVM erkannte kein physikalisches Volumen. Das ist anscheinend mal wieder ein klassischer Fall einer proprietären Lösung. Na toll. Da die alte Hardware so defekt war, das auch der „support mode“ nicht mehr funktionierte, beschlossen wir die Platten in mein Gehäuse zu stecken und von dort den „support mode“ zu starten, was überraschenderweise auch sofort funktionierte. Der Zugang per Telnet(!) blieb uns allerdings verwehrt, da dort ein Passwort verlangt wird, das wir nicht kennen, sicher aber alle Hacker dieser Erde.</p><p>Und jetzt kommt das wirklich unfassbare. Das NAS hängt jetzt auf Anweisung von Netgear für ungewisse Zeit mit Portweiterleitung von TCP/23 am Internet, damit ein Netgear-Supportmitarbeiter das Gerät per Telnet fixen kann. Diese Mitarbeiter arbeiten entweder aus Amerika oder China. Noch Fragen?</p><p>Das Fazit für uns ist auf jeden Fall, das unsere Geräte auf den Müll oder in die Bucht fliegen und wir ab sofort auf gängige Standards setzen. Es gibt im Moment NAS Gehäuse für 4 Platten mit Intel Atom CPUs und Windows Home Server. Wenn Man den Home Server wegwirft und zum Beispiel <a
href="http://www.openfiler.com/" target="_blank">Openfiler</a> oder <a
href="http://freenas.org/" target="_blank">FreeNAS</a> installiert sind das sicher performante Geräte. ECC Speicher wird es wohl nicht geben, aber dafür einen nachgerüsteten Hardware-RAID Controller.</p><p>Also falls Ihr so ein NAS besitzt, IMMER an die Datensicherung der Datensicherung denken ;-)</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/04/nas-falsche-sicherheit/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>ZCE Zend Certified Engineer</title><link>http://web-rocker.de/2011/03/zce-zend-certified-engineer/</link> <comments>http://web-rocker.de/2011/03/zce-zend-certified-engineer/#comments</comments> <pubDate>Mon, 14 Mar 2011 19:52:27 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[ZCE]]></category> <category><![CDATA[zendserver]]></category> <category><![CDATA[ZendStudio]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=372</guid> <description><![CDATA[Das sind doch mal gute Nachrichten: Ab dem 27. März 2011 bekommen neue und bestehende Zend Certified Engineer&#8217;s eine kostenlose Entwicklerlizenz vom ZendStudio und dem ZendServer. Allerdings ist die ZCE Prüfung nun mit 195 Euro 70 Euro teurer geworden, was bei diesen tollen Geschenken natürlich problemlos zu verschmerzen ist. Der ZendServer steht wohl unter einer &#8230; <a
href="http://web-rocker.de/2011/03/zce-zend-certified-engineer/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Das sind doch mal gute Nachrichten: Ab dem 27. März 2011 bekommen neue und bestehende Zend Certified Engineer&#8217;s eine kostenlose Entwicklerlizenz vom ZendStudio und dem ZendServer. Allerdings ist die ZCE Prüfung nun mit 195 Euro 70 Euro teurer geworden, was bei diesen tollen Geschenken natürlich problemlos zu verschmerzen ist. Der ZendServer steht wohl unter einer Entwicklerlizenz, wie es sie früher mal um 300 Euro rum gab. Ein Wirkbetrieb war damit damals nicht erlaubt, nur die Entwicklung.</p><p>Nähere Informationen gibt es <a
href="http://www.zend.com/de/services/certification/#freess">hier</a> auf der Zend Seite.</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/03/zce-zend-certified-engineer/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>CacheAction Plugin for Zend Framework</title><link>http://web-rocker.de/2011/01/cacheaction-plugin-for-zend-framework/</link> <comments>http://web-rocker.de/2011/01/cacheaction-plugin-for-zend-framework/#comments</comments> <pubDate>Sat, 22 Jan 2011 23:37:45 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Zend Framework]]></category> <category><![CDATA[asynchron]]></category> <category><![CDATA[performance]]></category> <category><![CDATA[php]]></category> <category><![CDATA[zend framework]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=310</guid> <description><![CDATA[Aufbauend auf meinem Artikel zum AjaxAction View Helper möchte ich nun mein CacheAction plugin für das Zend Framework vorstellen. Es wird einfach als FrontController Plugin registriert und cacht die Responses von Controlleraktionen. Soweit noch keine Kunst. Seine ware Stärke spielt das Plugin erst in Verbindung mit dem AjaxAction View Helper aus. Die zwei sind zusammen &#8230; <a
href="http://web-rocker.de/2011/01/cacheaction-plugin-for-zend-framework/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Aufbauend auf meinem <a
href="http://web-rocker.de/2011/01/ajaxaction-view-helper-for-zend-framework/" target="_blank">Artikel zum AjaxAction View Helper</a> möchte ich nun mein <strong>CacheAction</strong> plugin für das Zend Framework vorstellen. Es wird einfach als FrontController Plugin registriert und cacht die Responses von Controlleraktionen.</p><p>Soweit noch keine Kunst. Seine ware Stärke spielt das Plugin erst in Verbindung mit dem AjaxAction View Helper aus. Die zwei sind zusammen das dynamische Duo :-)</p><p><strong>Das Prinzip ist einfach:</strong><br
/> Liegen die Ergebnisse von einer Controlleraktion bereits im Cache vor, so wir der Inhalt ohne Umwege, direkt in das HTML der  Hauptseite eingebaut und ausgeliefert. Ist das Ergebnis noch nicht im  Cache, wir die Seite unvollständig, aber schnell ausgeliefert und der  fehlende Inhalt kommt per AJAX hinterher.<span
id="more-310"></span></p><p><strong>Die Konfiguration</strong><br
/> Damit der Entwickler komfortabel und zentral entscheiden kann, ob eine Route und wielange sie gecacht werden soll. Dazu wird dem dem Request einfach der Parameter <strong>cacheaction-ttl</strong> mit der Anzahl an Sekunden, die eine Antwort gespeichert werden soll mitgegeben. Zum Beispiel so:</p><pre class="brush:plain">resources.router.routes.content.route = "/content/:action/*"
resources.router.routes.content.defaults.controller = "content"
resources.router.routes.content.defaults.action = "index"
resources.router.routes.content.defaults.module = "default"
resources.router.routes.content.defaults.cacheaction-ttl = "20"</pre><p>Das Plugin in sebst benötigt nur die Information, welchen Cache es aus der CacheManager Ressource verwenden soll und ob es aktiv ist, oder nicht In unserem Fall den &#8220;action&#8221; Cache.</p><pre class="brush:plain">cacheaction.cache = "action"
cacheaction.enabled = "true"
resources.frontController.plugins.cacheaction.class = "Webrocker_Plugin_CacheAction"</pre><p>Auf diese Konfigutation greift auch der <strong>AjaxAction</strong> View Helper zurück, weitere Konfiguration ist nicht notwendig.</p><p>Wenn das Plugin geladen ist, gibt es zusätzliche Header in der Response, um die Fehlersuche zu vereinfachen. Die Header beginnen mit <strong>x-cacheaction-*</strong>.</p><p>In dem Video kann man schön sehen, wie hoch der spontan die Seite reagiert und wie vereinzelt Daten per AJAX nachgeladen werden müssen, weil der Cache abgelaufen ist.</p><p><object
style="height: 390px; width: 640px"><param
name="movie" value="http://www.youtube.com/v/GF3vCJZDuHo?version=3"><param
name="allowFullScreen" value="true"><param
name="allowScriptAccess" value="always"><embed
src="http://www.youtube.com/v/GF3vCJZDuHo?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="390"></object></p><p>Näheres dazu auf der <a
href="http://web-rocker.de/projekte/cacheaction-plugin-for-zend-framework/" target="_blank">Projektseite</a>.</p><p>Viel Spaß beim Ausprobieren!</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/01/cacheaction-plugin-for-zend-framework/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>AjaxAction view helper for Zend Framework</title><link>http://web-rocker.de/2011/01/ajaxaction-view-helper-for-zend-framework/</link> <comments>http://web-rocker.de/2011/01/ajaxaction-view-helper-for-zend-framework/#comments</comments> <pubDate>Sat, 22 Jan 2011 18:32:12 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Zend Framework]]></category> <category><![CDATA[asynchron]]></category> <category><![CDATA[php]]></category> <category><![CDATA[zend framework]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=284</guid> <description><![CDATA[Bei größeren Webapplikationen kann es immer mal wieder vorkommen, das Inhalte oder ein Teilbereiche einer Webseite nicht spontan verfügbar sind. Ursachen dafür sind oft kalte Caches von Models oder die Latenzen die durch die Kommunikation mit extenen Webservices bedingt sind. Ich war es irgendwann Leid diese Wartezeiten zu einem Problem des Users machen zu müssen &#8230; <a
href="http://web-rocker.de/2011/01/ajaxaction-view-helper-for-zend-framework/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Bei größeren Webapplikationen kann es immer mal wieder vorkommen, das Inhalte oder ein Teilbereiche einer Webseite nicht spontan verfügbar sind. Ursachen dafür sind oft kalte Caches von Models oder die Latenzen die durch die Kommunikation mit extenen Webservices bedingt sind. Ich war es irgendwann Leid diese Wartezeiten zu einem Problem des Users machen zu müssen und habe einen kleinen View Helper entwickelt, der langlaufende Prozesse loskoppelt und das Ergebnis per AJAX nachliefert.</p><p>Im Prinzip wird die Webseite unvollständig an den User übermittelt und dann in seinem Webbrowser fertig gerendert.<span
id="more-284"></span></p><p>Um die Problemstellung zu verdeutlichen habe ich einen <strong>ContentController</strong> geschrieben, dessen Geschwindigkeitsengpässe wohl keiner weiteren Erklärung bedürfen :-)</p><pre class="brush:php">class ContentController extends Zend_Controller_Action
{
    public function getnavigationAction()
    {
        sleep(1);
        $this-&gt;view-&gt;assign('navi', 'This Navigation takes 1 second');
    }
    public function getcontentAction()
    {
        sleep(2);
        $this-&gt;view-&gt;assign('content', 'Delicious content takes 2 seconds');
    }
    public function gettweetsAction()
    {
        sleep(2);
        $twitter = new Zend_Service_Twitter_Search();
        $this-&gt;view-&gt;assign(
            'tweets',
            $twitter-&gt;search('php', array('lang' =&gt; 'en', 'rpp' =&gt; 5))
        );
    }
}</pre><p>Dieser <strong>ContentController</strong> liefert Teilbereiche meiner Webseite aus. Eine Navigation, den Inhalt und einen Twitterstream. Aller Actions sind mit einer Zeitverzögerung von 1 oder 2 Sekunden ausgestattet, um den Vergleich deutlicher darstellen zu können.</p><p>Diese Teilbereiche fasse ich in der Index View, mit Hilfe des von Zend mitgelieferten <a
href="http://framework.zend.com/manual/de/zend.view.helpers.html" target="_blank"><strong>Action</strong> View Helpers</a> zusammen:</p><pre class="brush:html">&lt;div&gt;
 &lt;h1&gt;old-school version&lt;/h1&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="/index/async"&gt;open the same page using AjaxAction helper&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
 &lt;h3&gt;This is a REALLY expensive navigation&lt;/h3&gt;
 &lt;?php echo $this-&gt;action('getnavigation', 'content', null, array()); ?&gt;
 &lt;h3&gt;This is the content&lt;/h3&gt;
 &lt;?php echo $this-&gt;action('getcontent', 'content', null, array()); ?&gt;
 &lt;h3&gt;This is a cool result of a call to the Twitter-API&lt;/h3&gt;
 &lt;?php echo $this-&gt;action('gettweets', 'content', null, array()); ?&gt;
&lt;/div&gt;</pre><p>Lade ich nur die Seite dauert es natürlich geschlagene 6 Sekunden, bis die Seite an den Webbrowser ausgeliefert wird.<br
/> <a
href="http://web-rocker.de/wp-content/uploads/oldschool-rendering.png"><img
class="alignnone size-medium wp-image-292" title="oldschool-rendering" src="http://web-rocker.de/wp-content/uploads/oldschool-rendering-600x568.png" alt="" width="600" height="568" /></a></p><p>Ersetze ich jetzt den View Helper <strong>Action</strong> durch <strong>AjaxAction</strong> und füge einen Parameter mit einem AJAX-Partial hinzu, das sich um die AJAX Magic kümmert, sieht meine View wie folgt aus:</p><pre class="brush:html">&lt;div&gt;
 &lt;h1&gt;Welcome to the AjaxAction View Helper Demo&lt;/h1&gt;
 &lt;ul&gt;
 &lt;li&gt;&lt;a href="/index/sync"&gt;open the oldschool version (synchronous)&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
 &lt;h3&gt;This is a REALLY expensive navigation&lt;/h3&gt;
 &lt;?php echo $this-&gt;ajaxAction('getnavigation', 'content', null, array(), '_partials/ajax.phtml'); ?&gt;
 &lt;h3&gt;This is the content&lt;/h3&gt;
 &lt;?php echo $this-&gt;ajaxAction('getcontent', 'content', null, array(), '_partials/ajax.phtml'); ?&gt;
 &lt;h3&gt;This is a cool result of a call to the Twitter-API&lt;/h3&gt;
 &lt;?php echo $this-&gt;ajaxAction('gettweets', 'content', null, array(), '_partials/ajax.phtml'); ?&gt;
&lt;/div&gt;</pre><p>Jetzt Rufe ich die Seite erneut auf:<br
/> <a
href="http://web-rocker.de/wp-content/uploads/asynchronous-rendering.png"><img
class="alignnone size-medium wp-image-296" title="asynchronous-rendering" src="http://web-rocker.de/wp-content/uploads/asynchronous-rendering-600x568.png" alt="" width="600" height="568" /></a></p><p>Die komplette Seite konnte nun trotz der langlaufenden Prozesse unter 3 Sekunden, vollständig gerendert dargestellt werden.</p><p>Die Anpassung an das AJAX Framework der Wahl gestaltet sich einfach, es muss nur das Partial <strong>ajax.phtml</strong> angepasst werden. Hier mein Partial mit <a
href="http://jquery.com/" target="_blank">JQuery</a>:</p><pre class="brush:html">&lt;div id="&lt;?php echo $this-&gt;ajaxActionId ?&gt;"&gt;
Content is beeing generated for You, please stand by...
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
$('#&lt;?php echo $this-&gt;ajaxActionId; ?&gt;').load('&lt;?php echo $this-&gt;ajaxActionUrl; ?&gt;');
&lt;/script&gt;</pre><p>Schaut Euch einfach mal das Demoprojekt an, ich habe es komplett bei GitHub hochgeladen: <a
href="https://github.com/webrocker/AjaxAction-View-Helper-for-Zend-Framework" target="_blank">AjaxAction-View-Helper-for-Zend-Framework</a></p><p>Dieser View Helper ist aber erst der Anfang! In Kürze werde ich ein FrontController Plugin mit dem tollen Namen ActionCache veröffentlichen. Es arbeitet Hand in Hand mit dem <a
href="http://web-rocker.de/projekte/ajaxaction-view-helper-for-zend-framework/" target="_blank">AjaxAction View Helper</a> und ermöglicht ein hervorragend einfaches Caching von Teilbereichen und geringe Wartezeiten für User, die eine Seite aus einem kalten Cache abrufen.</p><p><strong>Hier gehts weiter:</strong><br
/> <a
href="http://web-rocker.de/2011/01/cacheaction-plugin-for-zend-framework/" target="_self">Artikel CacheAction Plugin For Zend Framework</a></p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/01/ajaxaction-view-helper-for-zend-framework/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Zend Server CE vs. Zend Server vs. Dotdeb</title><link>http://web-rocker.de/2011/01/zendserver-ce-vs-zendserver-vs-dotdeb/</link> <comments>http://web-rocker.de/2011/01/zendserver-ce-vs-zendserver-vs-dotdeb/#comments</comments> <pubDate>Fri, 21 Jan 2011 01:15:14 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Web-Rocker Showdown]]></category> <category><![CDATA[performance]]></category> <category><![CDATA[php]]></category> <category><![CDATA[showdown]]></category> <category><![CDATA[vergleich]]></category> <category><![CDATA[zendserver]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=254</guid> <description><![CDATA[In meinem Web Rocker Showdown zum Thema Zend Framework vs. Ruby On Rails habe ich als PHP-Stack und Applikationsserver den Zend Server Community Edition verwendet. Während des Tests war mir aufgefallen, das der Zend Server CE die Harware nicht voll ausnutzt. Alle 4 CPUs waren nur zu 60% belegt. Dieses Phänomen möchte ich in diesem &#8230; <a
href="http://web-rocker.de/2011/01/zendserver-ce-vs-zendserver-vs-dotdeb/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>In meinem Web Rocker Showdown zum Thema <a
href="http://web-rocker.de/2011/01/zend-framework-vs-ruby-on-rails/" target="_blank">Zend Framework vs. Ruby On Rails</a> habe ich als PHP-Stack und Applikationsserver den <a
href="http://www.zend.com/en/products/server-ce/index" target="_blank">Zend Server Community Edition</a> verwendet. Während des Tests war mir aufgefallen, das der Zend Server CE die Harware nicht voll ausnutzt. Alle 4 CPUs waren nur zu 60% belegt. Dieses Phänomen möchte ich in diesem Artikel genauer untersuchen indem ich den Zend Server CE mit der kommerziellen Version und einem PHP 5.3 aus dem <a
href="http://www.dotdeb.org/instructions/" target="_blank">DotDeb-Repository</a> vergleiche. Die Testhardware, das Betriebssystem und die PHP-Applikation sind identisch mit dem vorherigen Showdown.<span
id="more-254"></span></p><p>Mein Versuchsaufbau sieht wie folgt aus:</p><p><strong>Hardware:</strong><br
/> Dell PowerEdge 860<br
/> Intel XEON QuadCore mit 2,13 Ghz<br
/> 4 Gb Arbeitsspeicher<br
/> SAS300 Hardware RAID0<br
/> 2x 73Gb 10k SAS HDDs<br
/> <strong><br
/> Software:</strong><br
/> Debian 5.0.7 x86_64<br
/> Apache Bench<br
/> Htop</p><p><strong>Testapplikation:</strong><br
/> Einfachst denkbare Applikation.  Eine Standart-Applikation die mit dem  ZF-Kommando erzeugt wurde. Zusätzlich wir mit den  Kommandos ein Page-Controller mit  Index-Action und View erzeugt. Das Frameworks läuft  im Environment “production”.</p><p><strong>Testverfahren:</strong><br
/> Mit ApacheBench wird 10.000 mal die URL http://127.0.0.1/page/index/  aufgerufen, 1x als Warmup und sofort im Anschluß 1x für die Messung. Die  Durchläufe werden mit 1, 2, 4, 8, 16, 32, 64 und 128 zeitgleichen  Zugriffen durchgeführt. Wenn ungefähr 9.000 Zugriffe geschehen sind, ermittele ich mit  Htop die Hardwarenutzung. Danach notiere ich die Ergebnisse von Apache Bench. Hier  interessierten mich diesmal nur die  ermittelten Requests pro Sekunde.</p><p><strong>Ergebnisse:</strong><br
/> <a
href="http://web-rocker.de/wp-content/uploads/requests_per_second.png"><img
class="alignnone size-medium wp-image-336" title="requests_per_second" src="http://web-rocker.de/wp-content/uploads/requests_per_second-600x360.png" alt="" width="600" height="360" /></a></p><p><strong>Fazit:</strong><br
/> Die Kommerzielle Version des Zend Servers ist im Schnitt 150% leistungsfähiger als die Community Edition und praktisch gleich auf mit dem PHP-Stack aus dem DotDeb-Repository. Wem es nur um die Leitung und weniger um SLA&#8217;s und kommerziellen Support geht, kann die Lizenzgebühr sparen und wird sicher mit DotDeb bestens bedient sein.</p><p>Zum Schluss stellt sich die Frage, ob der Zend Server CE künstlich verlangsamt wurde, um den Kauf der kommerziellen Version schmackhaft zu machen. Was meint Ihr?</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/01/zendserver-ce-vs-zendserver-vs-dotdeb/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>PHP-Applikationen mit Cucumber testen</title><link>http://web-rocker.de/2011/01/php-applikationen-mit-cucumber-testen/</link> <comments>http://web-rocker.de/2011/01/php-applikationen-mit-cucumber-testen/#comments</comments> <pubDate>Tue, 18 Jan 2011 20:05:04 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Agile Methoden]]></category> <category><![CDATA[akzeptanztest]]></category> <category><![CDATA[behaviour driven development]]></category> <category><![CDATA[cucumber]]></category> <category><![CDATA[php]]></category> <category><![CDATA[ruby]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=157</guid> <description><![CDATA[User Acceptance Tests (UAT) oder auf Deutsch &#8220;Akzeptanztests&#8221; sind eine wichtige Komponente in der Testgetriebenen Entwicklung. Bisher kannte ich die üblichen Verdächtigen, also Selenium. Man kann damit komfortabel einen Klickpfad definieren, PHP-Code exportieren und daraus einen Test für PHPUnit erzeugen. Leider benötigen diese Tests immer einen laufenden Seleniumdienst, einen Browser und diesen ganzen Kram. Ich &#8230; <a
href="http://web-rocker.de/2011/01/php-applikationen-mit-cucumber-testen/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>User Acceptance Tests (<a
href="http://de.wikipedia.org/wiki/User_Acceptance_Test#Abnahmetest" target="_blank">UAT</a>) oder auf Deutsch &#8220;Akzeptanztests&#8221; sind eine wichtige Komponente in der Testgetriebenen Entwicklung. Bisher kannte ich die üblichen Verdächtigen, also <a
href="http://seleniumhq.org/" target="_blank">Selenium</a>. Man kann damit komfortabel einen Klickpfad definieren, PHP-Code exportieren und daraus einen Test für <a
href="https://github.com/sebastianbergmann/phpunit/" target="_blank">PHPUnit</a> erzeugen. Leider benötigen diese Tests immer einen laufenden Seleniumdienst, einen Browser und diesen ganzen Kram. Ich bin eher ein Fan von Testmethoden die headless funktionieren, direkt auf einer Shell. Bei meinem Blick über den Tellerrand in Richtung Ruby On Rails bin ich auf <a
href="http://cukes.info/" target="_blank">Cucumber</a> aufmerksam geworden. Cucumber ist ein tolles Test-Framework für <a
href="http://en.wikipedia.org/wiki/Behavior_Driven_Development" target="_blank">Behaviour Driven Development</a>, das mit menschenlesbaren Tests im Klartext arbeitet. Zusammen mit <a
href="https://github.com/brynary/webrat" target="_blank">Webrat</a>, einem Toolkit um Webbrowser fernzusteuern oder mit <a
href="http://mechanize.rubyforge.org/mechanize/" target="_blank">Mechanize</a> komplett headless zu arbeiten, kann man Webapplikationen hervorragend testen.</p><p>Am Beispiel der Google-Suche werde ich zeigen, wie einfach man Tests mit Cucumber anlegen kann und das Testen damit wirklich Spaß macht :-)<span
id="more-157"></span></p><p>Die Installation von Cucumber ist denkbar einfach. Als Basis benötigen wir eine lauffähige Ruby Umgebung. Wie man die einrichtet findet man zur genüge im Netz. Die glücklichen Mac Benutzer unter uns können sich an dieser Stelle ins gemachte Nest setzen, hier wird alles ab Werk mitgeliefert. Cucumber, Webrat und Mechanize können wir ganz einfach mit <strong>gem</strong>, dem Paketmanager von Ruby, installieren:</p><pre class="brush:bash">sudo gem install cucumber
sudo gem install webrat
sudo gem install mechanize</pre><p>Jetzt erstellen wir die Verzeichnisstruktur für die Cucumber Tests, sowie 3 leere Dateien:</p><pre class="brush:bash">mkdir tests
mkdir tests/features
mkdir tests/features/support
mkdir tests/features/step_definitions
touch tests/features/search.feature
touch tests/features/support/env.rb
touch tests/features/step_definitions/search_steps.rb</pre><p><img
class="alignnone size-full wp-image-206" title="cucumber_schritt_1" src="http://web-rocker.de/wp-content/uploads/cucumber_schritt_1.png" alt="" width="589" height="388" /><br
/> Zuerst definieren wir das Environment für die Cucumber Tests. Wir laden im Prinzip Webrat und sagen Webrat das er &#8220;mechanize&#8221; benutzen soll, um die Webseiten zu rendern. Die Datei <strong>tests/features/support/env.rb</strong> füllen wir also mit folgendem Inhalt:</p><pre class="brush:ruby">require 'webrat'
Webrat.configure do |config|
  config.mode = :mechanize
end
World(Webrat::Methods)
World(Webrat::Matchers)</pre><p>Jetzt schreiben wir unser erstes Testszenario, eine einfache Suche, in die Datei <strong>tests/features/search.feature:</strong></p><pre class="brush:text">Feature: Search
  In order to find information
  As an user
  I want to use the search function
  Scenario: Simple search and check for result
    Given I am on the Google search page
    When I search for "car"
    Then I should see "car" in the search results</pre><p>Nun rufen wir Cucumber auf um zu sehen, was es von unserem Szenario hält:</p><pre class="brush:bash">cd tests
cucumber</pre><p>Jetzt sagt uns Cucumber das es undefinierte Schritte gibt und schlägt uns ein Gerüst vor, um diese Schritte einfach implementieren zu können:<br
/> <img
class="alignnone size-full wp-image-211" title="cucumber_schritt_2" src="http://web-rocker.de/wp-content/uploads/cucumber_schritt_2.png" alt="" width="589" height="388" /></p><p>Dieses Gerüst kopieren wir einfach 1:1 in die Datei <strong>tests/features/step_definitions/search_steps.rb</strong>:</p><pre class="brush:ruby">Given /^I am on the Google search page$/ do
  pending # express the regexp above with the code you wish you had
end
When /^I search for "([^"]*)"$/ do |arg1|
  pending # express the regexp above with the code you wish you had
end
Then /^I should see "([^"]*)" in the search results$/ do |arg1|
  pending # express the regexp above with the code you wish you had
end</pre><p>Nun führen wir Cucumber erneut aus:<br
/> <img
class="alignnone size-full wp-image-216" title="cucumber_schritt_3" src="http://web-rocker.de/wp-content/uploads/cucumber_schritt_3.png" alt="" width="589" height="388" /></p><p>Nun weist Cucumber uns darauf hin das es noch Schritte gibt, die wir noch nicht implementiert haben. Im folgenden implementieren wir Schritt für Schritt die fehlenden Schritte. Zuerst das Öffnen der Webseite. Dazu ersetzen wir in Zeile 2 das &#8220;pending&#8221; durch die Zeile:</p><pre class="brush:ruby">visit "http://www.google.de"
</pre><p>Nun führen wir Cucumber erneut aus, um zu sehen ob der Schritt funktioniert:<br
/> <img
class="alignnone size-full wp-image-222" title="cucumber_schritt_4" src="http://web-rocker.de/wp-content/uploads/cucumber_schritt_4.png" alt="" width="589" height="388" /></p><p>Hervorragend! Ein Schritt ist grün, wir haben noch zwei vor uns. Jetzt füllen wir das Imput-Feld mit dem Namen &#8220;q&#8221; mit unserem Suchberiff und klicken auf den Button mit dem Namen &#8220;Google-Suche&#8221;. Dazu ersetzen wir ab Zeile 7 das &#8220;pending&#8221; durch folgende Zeilen:</p><pre class="brush:ruby">fill_in "q", :with =&gt; arg1
click_button "Google-Suche"
</pre><p>Nun führen wir Cucumber erneut aus:<br
/> <img
class="alignnone size-full wp-image-227" title="cucumber_schritt_5" src="http://web-rocker.de/wp-content/uploads/cucumber_schritt_5.png" alt="" width="589" height="388" /><br
/> Jetzt implementieren wir den letzten Schritt. Wir überprüfen ob wir mindestens einen Suchtreffer zu &#8220;car&#8221; haben. In der Ergebnisseite suchen wir also in allen Div&#8217;s der Klasse &#8220;s&#8221; nach Em-Tags mit dem Inhalt &#8220;car&#8221;. Der letzte Schritt lautet also wie folgt:</p><pre class="brush:ruby">response_body.should have_selector('div.s em') do |em|
  em.should contain(arg1)
end</pre><p>Das Gesamtkunstwerk sieht jetzt also so aus:</p><pre class="brush:ruby">Given /^I am on the Google search page$/ do
  visit "http://www.google.de"
end
When /^I search for "([^"]*)"$/ do |arg1|
  fill_in "q", :with =&gt; arg1
  click_button "Google-Suche"
end
Then /^I should see "([^"]*)" in the search results$/ do |arg1|
  response_body.should have_selector('div.r em') do |em|
    em.should contain(arg1)
  end
end
</pre><p>Nun rufen wir wieder Cucumber auf:<br
/> <img
class="alignnone size-full wp-image-235" title="cucumber_schritt_6" src="http://web-rocker.de/wp-content/uploads/cucumber_schritt_6.png" alt="" width="589" height="388" /><br
/> Jetzt habe ich unerwarteterweise einen Fehler bekommen. Die Ursache liegt in einem 302-Redirect. Es kommt einfach kein Suchergebnis.</p><p>Ich hätte diesen kleinen Ausflug in die Welt von Cucumber natürlich gerne mit einem &#8220;grünen&#8221; Testlauf abgeschlossen, aber ich hoffe das ich trotzdem ein wenig Neugierde bei dem ein oder anderen wecken konnte.</p><p>In den nächsten Wochen werde ich noch weitere Beispiel-Szenarien veröffentlichen, also schön am Ball bleiben :-)</p><p>Viel Spaß beim Ausprobieren!</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/01/php-applikationen-mit-cucumber-testen/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Zend Framework vs. Ruby On Rails</title><link>http://web-rocker.de/2011/01/zend-framework-vs-ruby-on-rails/</link> <comments>http://web-rocker.de/2011/01/zend-framework-vs-ruby-on-rails/#comments</comments> <pubDate>Thu, 13 Jan 2011 00:52:53 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Web-Rocker Showdown]]></category> <category><![CDATA[performance]]></category> <category><![CDATA[ruby on rails]]></category> <category><![CDATA[showdown]]></category> <category><![CDATA[vergleich]]></category> <category><![CDATA[zend framework]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=96</guid> <description><![CDATA[Heute geht es um ein Frage, die mich schon lange beschäftigt: Was ist schneller? Zend Framework MVC oder Ruby on Rails? Und wie skalieren die unterschiedlichen Architekturen bei zunehmenden, parallelen Zugriffen? Wie effizient wird meine Hardware genutzt? Die Antworten auf diese Fragen habe ich natürlich für Euch in einem Web-Rocker Showdown empirisch ermittelt :-) Mein &#8230; <a
href="http://web-rocker.de/2011/01/zend-framework-vs-ruby-on-rails/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Heute geht es um ein Frage, die mich schon lange beschäftigt: Was ist schneller? <a
href="http://www.zend.com/de/community/framework" target="_blank">Zend Framework MVC</a> oder <a
href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a>? Und wie skalieren die unterschiedlichen Architekturen bei zunehmenden, parallelen Zugriffen? Wie effizient wird meine Hardware genutzt? Die Antworten auf diese Fragen habe ich natürlich für Euch in einem Web-Rocker Showdown empirisch ermittelt :-)</p><p>Mein Versuchsaufbau sieht wie folgt aus:</p><p><strong>Hardware:</strong><br
/> Dell PowerEdge 860<br
/> Intel XEON QuadCore mit 2,13 Ghz<br
/> 4 Gb Arbeitsspeicher<br
/> SAS300 Hardware RAID0<br
/> 2x 73Gb 10k SAS HDDs<br
/> <strong><br
/> Software:</strong><br
/> Debian 5.0.7 x86_64<br
/> Apache Bench<br
/> Htop<span
id="more-96"></span><br
/> <strong><br
/> Server Zend Framework:</strong><br
/> <a
href="http://www.zend.com/de/products/server/editions" target="_blank">Zend Server CE 5.0.4</a><br
/> PHP 5.3.3<br
/> Opcode Cache</p><p><strong>Server RAILS3:</strong><br
/> Zend Server CE 5.0.4<br
/> mod_rails (<a
href="http://www.modrails.com/" target="_blank">Phusion Passenger</a>)<br
/> <a
href="http://www.rubyenterpriseedition.com/" target="_blank">Ruby 1.8.7</a></p><p><strong>Testapplikation:</strong><br
/> Einfachst denkbare Applikation. Eine Standart-Applikation die mit dem  ZF-Kommando und RAILS-Kommando erzeugt wurde. Zusätzlich wir mit den  Kommandos ein Page-Controller mit Index-Action und Views erzeugt. Die Views wurden so angepasst, das auf das Byte genau, das gleiche HTML erzeugt wird. Beide Frameworks laufen im Environment &#8220;production&#8221;.</p><p><strong>Testverfahren:</strong><br
/> Mit Apache Bench wird 10.000 mal die URL http://127.0.0.1/page/index/ aufgerufen, 1x als Warmup und sofort im Anschluß 1x für die Messung. Die Durchläufe werden mit 1, 2, 4, 8, 16, 32, 64 und 128 zeitgleichen Zugriffen durchgeführt. Wenn ungefähr 9.000 Zugriffe geschehen sind, mache ich einen Screenshot von Htop, um die CPU-Auslastung ermitteln zu können. Danach notiere ich die Ergebnisse von ApacheBench. Hier interessierte mich die gemittelte Antwortzeit pro Request und die ermittelten Requests pro Sekunde.</p><p><strong>Ergebnisse:</strong><br
/> Requests pro Sekunde<br
/> <a
href="http://web-rocker.de/wp-content/uploads/requests_per_second1.png"><img
class="alignnone size-medium wp-image-136" title="requests_per_second" src="http://web-rocker.de/wp-content/uploads/requests_per_second1-600x355.png" alt="" width="600" height="355" /></a><a
rel="attachment wp-att-137" href="http://web-rocker.de/2011/01/zend-framework-vs-ruby-on-rails/requests_per_second_table-2/"><img
class="alignnone size-full wp-image-137" title="requests_per_second_table" src="http://web-rocker.de/wp-content/uploads/requests_per_second_table1.png" alt="" width="348" height="160" /></a></p><p>Antwortzeit in Millisekunden</p><p><a
href="http://web-rocker.de/wp-content/uploads/time_per_request1.png"><img
class="alignnone size-medium wp-image-138" title="time_per_request" src="http://web-rocker.de/wp-content/uploads/time_per_request1-600x354.png" alt="" width="600" height="354" /></a><a
rel="attachment wp-att-139" href="http://web-rocker.de/2011/01/zend-framework-vs-ruby-on-rails/time_per_request_table-2/"><img
class="alignnone size-full wp-image-139" title="time_per_request_table" src="http://web-rocker.de/wp-content/uploads/time_per_request_table1.png" alt="" width="348" height="162" /></a></p><p><strong>Hardwarenutzung:</strong><br
/> Im folgenden nur die Screenshots von 1, 2 und 4 Zeitgleichen Zugriffen. Die Screenshots von 8 &#8211; 128 sehen nahezu identisch aus, wie mit 4 zeitgleichen Zugriffen.<br
/> <a
href="http://web-rocker.de/wp-content/uploads/zend_cpu.jpg"><img
class="alignnone size-medium wp-image-111" title="zend_cpu" src="http://web-rocker.de/wp-content/uploads/zend_cpu-600x113.jpg" alt="" width="600" height="113" /></a><br
/> <a
href="http://web-rocker.de/wp-content/uploads/rails_cpu.jpg"><img
class="alignnone size-medium wp-image-112" title="rails_cpu" src="http://web-rocker.de/wp-content/uploads/rails_cpu-600x113.jpg" alt="" width="600" height="113" /></a></p><p><strong>Fazit:</strong><br
/> Ruby On Rails zusammen mit dem mod_rails nutzt die Hardware optimal aus. Die Gesamtperformance ist ungefähr 3x besser, als beim Zend Framework MVC auf einem Zend Server, mit allen Optimierungen. Zwischen 4 bis 16 Zeitgleichen Verbindungen arbeitet Rails am effizientesten auf einem 4-Kern-Server. Die PHP-Applikation hingegen liefert ab 4 Verbindungen durchweg die gleiche Anzahl an Verbindungen pro Sekunde. Wenn der Zend Server die Hardware vollständig ausnutzen würde, könnte das Zend Framework MVC sicher noch 50% mehr Leistung bringen. Ich werde bei Gelegenheit mal nachforschen, was dort blockiert hat.<br
/> <strong><br
/> And the winner is: Ruby On Rails mit mod_rails</strong></p><p><strong>Update:</strong></p><p>Nachdem ich in meinem <a
href="http://web-rocker.de/2011/01/zendserver-ce-vs-zendserver-vs-dotdeb/" target="_blank">Artikel Zend Server CE vs Zend Server vs DotDeb</a> herausgefunden habe, das der Zend Server CE nicht die geeignete Platform war um diese zwei Frameworks zu vergleichen, habe ich die Ergebnisse des ZF vs. Rails Showdowns noch mal neu aufgetragen. Entgegen meiner Vemutung das ich noch 50% mehr Leistung erwarten könnte waren es satte 150%, die der kommerzielle Zend Server und der PHP-Stack aus dem DotDeb Repository schneller waren. Seht selbst:<br
/> <a
href="http://web-rocker.de/wp-content/uploads/rps_vs_c.png"><img
class="alignnone size-medium wp-image-332" title="rps_vs_c" src="http://web-rocker.de/wp-content/uploads/rps_vs_c-600x361.png" alt="" width="600" height="361" /></a></p><p><a
href="http://web-rocker.de/wp-content/uploads/rt-vs-c.png"><img
class="alignnone size-medium wp-image-333" title="rt-vs-c" src="http://web-rocker.de/wp-content/uploads/rt-vs-c-600x360.png" alt="" width="600" height="360" /></a></p><p><strong>Fazit 2:</strong><br
/> Es gibt keinen Gewinner in diesem Vergleich. Wie wir aber sehen konnten hat die Wahl des richtigen PHP-Stacks eine enorme Tragweite, wenn es um die Performance geht.</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/01/zend-framework-vs-ruby-on-rails/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Apache 2 ITK MPM</title><link>http://web-rocker.de/2011/01/apache-2-itk-mpm/</link> <comments>http://web-rocker.de/2011/01/apache-2-itk-mpm/#comments</comments> <pubDate>Wed, 12 Jan 2011 18:43:45 +0000</pubDate> <dc:creator>web-rocker</dc:creator> <category><![CDATA[Server]]></category> <category><![CDATA[apache2]]></category> <category><![CDATA[linux]]></category> <guid
isPermaLink="false">http://web-rocker.de/?p=67</guid> <description><![CDATA[Nie wieder Rechteprobleme im Dateisystem! Klingt unglaublich? Ist es aber nicht, zumindest nicht für Entwicklungsumgebungen. Die meisten Entwicklungsumgebungen sehen oft wie folgt aus: &#8211; Linuxserver &#8211; Samba-Freigabe vom Rootverzeichnis der Webservers oder einzelner Projekt-VHosts &#8211; Apache Webserver mit VHosts für jedes Projekt &#8211; Die Entwickler mounten die Samba-Freigaben und arbeiten auf ihnen Nun kommen wir &#8230; <a
href="http://web-rocker.de/2011/01/apache-2-itk-mpm/">Read more <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Nie wieder Rechteprobleme im Dateisystem! Klingt unglaublich? Ist es aber nicht, zumindest nicht für Entwicklungsumgebungen.</p><p>Die meisten Entwicklungsumgebungen sehen oft wie folgt aus:</p><ul><li> &#8211; Linuxserver</li><li> &#8211; Samba-Freigabe vom Rootverzeichnis der Webservers oder einzelner Projekt-VHosts</li><li> &#8211; Apache Webserver mit VHosts für jedes Projekt</li><li> &#8211; Die Entwickler mounten die Samba-Freigaben und arbeiten auf ihnen</li></ul><p>Nun kommen wir zum eigentlichen Problem: Der Apache erzeugt Dateien als Benutzer <em>www-data</em> in Gruppe <em>www-data</em>, die Entwickler als Benutzer <em>entwicklerx</em> in Gruppe <em>users</em>.<br
/> Natürlich kann man die Verzeichnisrechte durch Stickybits, PHP-Umasks usw. in den Griff bekommen. Das ist aber recht kompliziert und funktioniert auch nicht überall wirklich zuverlässig.</p><p>Mit dem Modul <a
href="http://mpm-itk.sesse.net/" target="_blank">apache2-itk-mpm</a> läuft der Webserver als Benutzer <em>root</em> und ist dadurch in der Lage für jeden VHost einen Worker-Thread mit der Identität eines normalen Benutzer zu starten. Für einen Livebetrieb ist das natürlich ein Sicherheitsrisiko, der Livebetrieb ist aber auch selten das Problem. Die Entwicklungsarbeit kostet und jeden Tag Nerven.</p><p>Und so funktioniert es am Beispiel eines Debianartigen Systems:<span
id="more-67"></span></p><pre class="brush:bash">apt-get install apache2-itk-mpm</pre><p>Jetzt können wir pro VHost den dazugehörigen Benutzer konfigurieren.</p><pre class="brush:plain">&lt;VirtualHost *:80&gt;
    ServerAdmin webmaster@localhost
    ServerName projektx.devserver.local
    DocumentRoot /www/projektx/
    &lt;Directory /&gt;
        Options FollowSymLinks
        AllowOverride All
    &lt;/Directory&gt;
    &lt;Directory /www/projektx/&gt;
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
    &lt;/Directory&gt;
    &lt;IfModule mpm_itk_module&gt;
        AssignUserId entwicklerx users
    &lt;/IfModule&gt;
&lt;/VirtualHost&gt;</pre><p>Jetzt noch einmal den Apache durchstarten.</p><pre class="brush:bash">/etc/init.d/apache2 restart</pre><p>Das wars schon!</p> ]]></content:encoded> <wfw:commentRss>http://web-rocker.de/2011/01/apache-2-itk-mpm/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Dynamic page generated in 0.329 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2013-05-23 19:58:59 -->
