<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" ><channel><title>PHP Gangsta - Der PHP Blog mit Praxisbezug &#187; PHP</title> <atom:link href="http://www.phpgangsta.de/category/php/feed" rel="self" type="application/rss+xml" /><link>http://www.phpgangsta.de</link> <description>Ein PHP Blog mit Themen aller Art. Manchmal vergewaltige ich PHP...</description> <lastBuildDate>Thu, 02 Feb 2012 22:22:51 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>PGP und GPG: Wie arbeite ich mit asynchroner Verschlüsselung</title><link>http://www.phpgangsta.de/pgp-und-gpg-wie-arbeite-ich-mit-asynchroner-verschlusselung</link> <comments>http://www.phpgangsta.de/pgp-und-gpg-wie-arbeite-ich-mit-asynchroner-verschlusselung#comments</comments> <pubDate>Thu, 26 Jan 2012 08:36:43 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[gnupg]]></category> <category><![CDATA[gpg]]></category> <category><![CDATA[PGP]]></category> <category><![CDATA[PHP Magazin]]></category> <category><![CDATA[Verschlüsselung]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3845</guid> <description><![CDATA[PGP und GPG sollte den meisten ein Begriff sein, auch wenn es selbst noch nie oder nur sehr selten eingesetzt wird. Die wenigsten nutzen es wahrscheinlich täglich und beispielsweise mit allen E-Mail-Adressen. Einen Rundumschlag bezüglich asynchroner Verschlüsselung und PGP/GPG mit PHP habe ich für das PHP Magazin geschrieben. In der Ausgabe 1.12 erkläre ich darin [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p><img class="size-full wp-image-3943 alignright" style="border: 0pt none;" title="PHP Magazin Cover" src="http://www.phpgangsta.de/wp-content/uploads/phpmagcover.png" alt="" width="200" height="283" />PGP und GPG sollte den meisten ein Begriff sein, auch wenn es selbst noch nie oder nur sehr selten eingesetzt wird. Die wenigsten nutzen es wahrscheinlich täglich und beispielsweise mit allen E-Mail-Adressen.</p><p>Einen Rundumschlag bezüglich asynchroner Verschlüsselung und PGP/GPG mit PHP habe ich für das <a href="http://it-republik.de/php/php-magazin/" target="_blank">PHP Magazin</a> geschrieben. In der Ausgabe 1.12 erkläre ich darin das Grundkonzept von asynchroner Verschlüsselung und der Nutzung von GPG aus PHP heraus, zum Beispiel zum Versenden von signierten und/oder verschlüsselten E-Mails. Seit vorgestern gibt es den <a href="http://it-republik.de/php/artikel/Ziemlich-gute-Privatsphaere-4305.html" target="_blank">Artikel auch kostenlos Online</a>. Ich zeige wie man Dateien und Texte verschlüsseln, signieren, entschlüsseln und Signaturen prüfen kann. Am Ende verweise ich auf <a href="http://gpgtest.phpgangsta.de/" target="_blank">eine kleine GPG-Test-Webseite</a>, auf der man etwas mit GPG rumspielen kann. Außerdem habe ich <a href="http://gpgtest.phpgangsta.de/#gpgemailbot" target="_blank">einen kleinen GPG-E-Mail-Bot</a> gebastelt der auf eingehende E-Mails reagiert und mit dem man seine E-Mail-Verschlüsselung testen kann. Alle weiteren Details befinden sich auf der angesprochenen Webseite.</p><p><span id="more-3845"></span>Auch sehr interessante Informationen bietet der Artikel von Oliver Sperke hier im Blog <a href="http://www.phpgangsta.de/tlsssl-fur-heimwerker" target="_blank">zu GPG und speziell der Nutzung mit Javascript und PHP</a>, auch unbedingt lesenswert!</p><p>Ich würde mich freuen wenn ihr die Webseite und den E-Mail-Bot ausprobiert, und natürlich auch wenn ihr das PHP Magazin kauft und Feedback gebt. Mich würde zum Beispiel auch interessieren ob ihr aktuell E-Mails die ihr mit PHP verschickt, signiert und/oder verschlüsselt verschickt, und wenn nein, warum nicht? Oder nutzt ihr statt PGP eventuell S/MIME zur E-Mail-Verschlüsselung?</p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/pgp-und-gpg-wie-arbeite-ich-mit-asynchroner-verschlusselung/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Neuer frischer Gutschein für PHPStorm 3.0!</title><link>http://www.phpgangsta.de/neuer-frischer-gutschein-fur-phpstorm-3-0</link> <comments>http://www.phpgangsta.de/neuer-frischer-gutschein-fur-phpstorm-3-0#comments</comments> <pubDate>Tue, 24 Jan 2012 08:59:24 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Coupon]]></category> <category><![CDATA[Gutschein]]></category> <category><![CDATA[JetBrains]]></category> <category><![CDATA[PHPStorm]]></category> <category><![CDATA[Rabatt]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4214</guid> <description><![CDATA[Ich habe gute Nachrichten von JetBrains: Nach dem erfolgreichen Release der Version 3.0 im Dezember letzten Jahres habe ich wieder Gutscheine über 20% Preisnachlass beim Kauf einer Personal License von PHPStorm bekommen und kann diese an euch rausgeben! Wie bereits beim letzten Mal gilt dies nicht für Verlängerungen sondern nur für Neubestellungen der Personal License. [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/20-gutschein-fur-phpstorm-verlangert' rel='bookmark' title='20% Gutschein für PHPStorm verlängert!'>20% Gutschein für PHPStorm verlängert!</a></li><li><a href='http://www.phpgangsta.de/phpstorm-20-gunstiger-hier-bei-mir' rel='bookmark' title='PHPStorm 20% günstiger, hier bei mir'>PHPStorm 20% günstiger, hier bei mir</a></li><li><a href='http://www.phpgangsta.de/eilmeldung-phpstorm-satte-60-gunstiger' rel='bookmark' title='Eilmeldung: PHPStorm satte 50% günstiger!'>Eilmeldung: PHPStorm satte 50% günstiger!</a></li></ol>]]></description> <content:encoded><![CDATA[<p><img class="alignright size-full wp-image-4216" style="margin-left: 5px; margin-right: 5px; border: 0pt none;" title="PHPStorm" src="http://www.phpgangsta.de/wp-content/uploads/phpstorm1.png" alt="" width="297" height="79" />Ich habe gute Nachrichten von <a href="http://www.jetbrains.com/" target="_blank">JetBrains</a>: Nach dem erfolgreichen <a href="http://www.phpgangsta.de/phpstorm-3-0-erschienen" target="_blank">Release der Version 3.0 im Dezember</a> letzten Jahres habe ich wieder Gutscheine über 20% Preisnachlass beim Kauf einer Personal License von <a href="http://www.phpgangsta.de/?s=PHPStorm" target="_blank">PHPStorm</a> bekommen und kann diese an euch rausgeben!</p><p><span id="more-4214"></span>Wie bereits <a href="http://www.phpgangsta.de/20-gutschein-fur-phpstorm-verlangert" target="_blank">beim letzten Mal</a> gilt dies nicht für Verlängerungen sondern nur für Neubestellungen der Personal License. Der Gutschein ist gültig bis zum 23. Februar 2012.</p><p><img class="alignright size-full wp-image-4217" style="margin-left: 5px; margin-right: 5px; border: 0pt none;" title="PHPStorm 3.0 is out" src="http://www.phpgangsta.de/wp-content/uploads/phpstorm2.png" alt="" width="261" height="77" />Tja, was gibt es noch groß zu sagen, jeder PHP Entwickler sollte sich diese IDE anschauen und 30 Tage ausprobieren falls er sie noch nicht kennt, es ist aktuell meiner Meinung nach (und der vieler anderer) die beste IDE für PHP, auf der <a href="http://www.jetbrains.com/phpstorm/" target="_blank">Produktseite von PHPStorm bei JetBrains</a> kann man sich ausführlich informieren über die Features und Neuigkeiten, in <a href="http://www.jetbrains.com/phpstorm/documentation/index.html" target="_blank">Demo-Videos</a> wird eindrucksvoll gezeigt was die Software drauf hat, und <a href="http://blog.jetbrains.com/webide/" target="_blank">im Blog</a> stehen Neuigkeiten, werden wichtige Features wie das Remote Debugging erklärt etc.</p><p>Also erst ausprobieren, dann kaufen!</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/20-gutschein-fur-phpstorm-verlangert' rel='bookmark' title='20% Gutschein für PHPStorm verlängert!'>20% Gutschein für PHPStorm verlängert!</a></li><li><a href='http://www.phpgangsta.de/phpstorm-20-gunstiger-hier-bei-mir' rel='bookmark' title='PHPStorm 20% günstiger, hier bei mir'>PHPStorm 20% günstiger, hier bei mir</a></li><li><a href='http://www.phpgangsta.de/eilmeldung-phpstorm-satte-60-gunstiger' rel='bookmark' title='Eilmeldung: PHPStorm satte 50% günstiger!'>Eilmeldung: PHPStorm satte 50% günstiger!</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/neuer-frischer-gutschein-fur-phpstorm-3-0/feed</wfw:commentRss> <slash:comments>70</slash:comments> </item> <item><title>Den USB Mail Melder per Webseite steuern</title><link>http://www.phpgangsta.de/den-usb-mail-melder-per-webseite-steuern</link> <comments>http://www.phpgangsta.de/den-usb-mail-melder-per-webseite-steuern#comments</comments> <pubDate>Mon, 16 Jan 2012 08:47:21 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Mail Notifier]]></category> <category><![CDATA[USB Gadget]]></category> <category><![CDATA[Webfrontend]]></category> <category><![CDATA[Webinterface]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4198</guid> <description><![CDATA[Mein erstes richtiges USB-Gadget ist der USB Mail Melder (USB Mail Notifier). Um damit etwas zu experimentieren habe ich ein kleines Webinterface gebaut mit dem man in nahezu Echtzeit die Farben verändern kann. Doch erstmal ein Bild: Diese kleine Box kann man in allen Farben aufleuchten lassen. Normalerweise gibt es dazu Treiber und Software auf [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/bug-in-php-5-3-0s-mail-funktion' rel='bookmark' title='Bug in PHP 5.3.0&#8242;s mail() Funktion'>Bug in PHP 5.3.0&#8242;s mail() Funktion</a></li><li><a href='http://www.phpgangsta.de/die-mail-de-gmbh-sucht-javascript-entwickler' rel='bookmark' title='Die mail.de GmbH sucht Javascript-Entwickler'>Die mail.de GmbH sucht Javascript-Entwickler</a></li><li><a href='http://www.phpgangsta.de/webseite-testen-mit-browser-sandboxen' rel='bookmark' title='Webseite testen mit Browser Sandboxen'>Webseite testen mit Browser Sandboxen</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Mein erstes richtiges USB-Gadget ist der <a href="http://www.getdigital.de/products/USB_Mail_Melder/" target="_blank">USB Mail Melder</a> (USB Mail Notifier). Um damit etwas zu experimentieren habe ich ein kleines Webinterface gebaut mit dem man in nahezu Echtzeit die Farben verändern kann. Doch erstmal ein Bild:</p><p><img class="alignnone size-medium wp-image-4201" title="USB Mail Melder" src="http://www.phpgangsta.de/wp-content/uploads/mail_melder-300x226.jpg" alt="" width="300" height="226" /></p><p>Diese kleine Box kann man in allen Farben aufleuchten lassen. Normalerweise gibt es dazu Treiber und Software auf einer CD mitgeliefert. In der Software kann man via POP3 bzw. Webmail auf E-Mail-Accounts zugreifen, und bei neuen E-Mails aufleuchten lassen.</p><p><span id="more-4198"></span><img class="alignnone size-medium wp-image-4202" title="Mail Notifier Software" src="http://www.phpgangsta.de/wp-content/uploads/dreamcheeky-300x237.png" alt="" width="300" height="237" /></p><p>Ich dachte mir dann, wie wäre es das Gadget aus PHP heraus zu steuern? Leider mußte ich schnell feststellen dass man mit PHP nicht so leicht auf die USB-Schnittstelle zugreifen kann. Ich habe es jedenfalls nicht hinbekommen.</p><p>Aber Dank der hervorragenden Arbeit von <a href="http://www.christophs-blog.de/2011/01/usb-mail-notifier-schon-wieder/" target="_blank">Christoph gibt es auch ein kleines Kommandozeilen-Tool</a> mit dem man das Gadget erleuchten kann. Mein Webfrontend sieht dann so aus:</p><p><img class="alignnone size-full wp-image-4203" title="Mail Notifier Web" src="http://www.phpgangsta.de/wp-content/uploads/mailnotifierweb.png" alt="" width="322" height="398" /></p><p>Hier noch ein kleines Video:</p><p><iframe src="https://www.youtube.com/embed/KjNCEQpZy_M" frameborder="0" width="420" height="315"></iframe></p><p>Der Benutzer kann aktuell per Slider die drei Grundfarben einstellen, es X mal pulsieren lassen oder es ausschalten. Man könnte natürlich auch einen kleinen Daemon bauen der per IMAP/POP3 einige E-Mail-Accounts prüft, oder einen RSS Feed abfragt, oder oder oder. Alles was man mit PHP machen kann und bei dem man ein visuelles Feedback benötigt.</p><p>Den <a href="https://github.com/PHPGangsta/MailNotifierWebfrontend" target="_blank">Code gibt es bei Github</a>. Es ist nichts besonderes, hauptsächlich HTML, CSS und Javascript, sowie einige wenige Zeilen um auf das Kommandozeilentool von Christoph zuzugreifen.</p><p>Ich weiß nicht ob es unter Linux geht direkt auf die USB-Schnittstelle zuzugreifen, ich denke da an so etwas ähnliches hier:</p><pre class="brush: php; title: ; notranslate">&lt;?php
$string = &quot;Hallo Schnittstelle!\n&quot;;
$pointer = fopen(&quot;/dev/ttyS0&quot;,&quot;w&quot;);
fwrite ($pointer, $string);
fclose($pointer);</pre><p>Für Windows und die COM1 Schnittstelle habe ich diesen Schnipsel gefunden, ob das so oder so ähnlich auch für ein USB Gerät funktioniert habe ich noch nicht herausfinden können:</p><pre class="brush: php; title: ; notranslate">&lt;?php
`mode COM1: BAUD=4800 PARITY=N data=8 stop=1 xon=off`;

$fp = fopen (&quot;COM1:&quot;, &quot;w+&quot;);
if (!$fp) {
    echo &quot;can't open port: COM1&quot;;
} else {
    fputs ($fp, $string );
}</pre><p>Oder aber mittels der <a href="http://www.php.net/manual/de/ref.w32api.php" target="_blank">W32API auf eine DLL zugreifen</a> und darin eine Funktion aufrufen. Habe ich aber auch noch nie gemacht.</p><p>Wer das also schonmal gemacht hat oder eine Idee hat wie man auf eine Zwischensoftware verzichten kann, möge sich melden!</p><p>Danke nochmals an <a href="http://www.getdigital.de/" target="_blank">getDigital</a> für das Gadget!</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/bug-in-php-5-3-0s-mail-funktion' rel='bookmark' title='Bug in PHP 5.3.0&#8242;s mail() Funktion'>Bug in PHP 5.3.0&#8242;s mail() Funktion</a></li><li><a href='http://www.phpgangsta.de/die-mail-de-gmbh-sucht-javascript-entwickler' rel='bookmark' title='Die mail.de GmbH sucht Javascript-Entwickler'>Die mail.de GmbH sucht Javascript-Entwickler</a></li><li><a href='http://www.phpgangsta.de/webseite-testen-mit-browser-sandboxen' rel='bookmark' title='Webseite testen mit Browser Sandboxen'>Webseite testen mit Browser Sandboxen</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/den-usb-mail-melder-per-webseite-steuern/feed</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Linkpool Nummer 27 + Adventskalenderartikel 10.12. – 24.12.</title><link>http://www.phpgangsta.de/linkpool-nummer-27-adventskalenderartikel-10-12-%e2%80%93-24-12</link> <comments>http://www.phpgangsta.de/linkpool-nummer-27-adventskalenderartikel-10-12-%e2%80%93-24-12#comments</comments> <pubDate>Mon, 09 Jan 2012 08:36:34 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Javascript]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Advent 2011]]></category> <category><![CDATA[Adventskalender]]></category> <category><![CDATA[Lesepool]]></category> <category><![CDATA[Linkpool]]></category> <category><![CDATA[Links]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4048</guid> <description><![CDATA[Heute wieder eine lange Liste mit Artikeln die es zu Lesen gilt, hauptsächlich gefüllt mit Artikeln aus den Adventskalendern 2011. Artikel vor dem 09.12. befinden sich im ersten Adventskalender-Übersichts-Artikel. Info über ein 3 Jahre altes RFC für PHP für eine neue Syntax für Getter und Setter: http://bigwhoop.ch/artikel/119/2011-12-05/properties-neue-get-set-syntax-fr-php 10 Gründe nicht Test-Driven-Development (TDD) zu machen (oder [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/adventskalenderartikel-01-12-10-12' rel='bookmark' title='Adventskalenderartikel 01.12. &#8211; 10.12.'>Adventskalenderartikel 01.12. &#8211; 10.12.</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-20' rel='bookmark' title='Linkpool Nummer 20'>Linkpool Nummer 20</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-23' rel='bookmark' title='Linkpool Nummer 23'>Linkpool Nummer 23</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Heute wieder eine lange Liste mit Artikeln die es zu Lesen gilt, hauptsächlich gefüllt mit Artikeln aus den Adventskalendern 2011. Artikel vor dem 09.12. befinden sich im <a href="http://www.phpgangsta.de/adventskalenderartikel-01-12-10-12" target="_blank">ersten Adventskalender-Übersichts-Artikel</a>.</p><p>Info über ein 3 Jahre altes RFC für PHP für eine neue Syntax für Getter und Setter:</p><ul><li><a href="http://bigwhoop.ch/artikel/119/2011-12-05/properties-neue-get-set-syntax-fr-php" target="_blank">http://bigwhoop.ch/artikel/119/2011-12-05/properties-neue-get-set-syntax-fr-php</a></li></ul><p>10 Gründe nicht Test-Driven-Development (TDD) zu machen (oder auch nicht):</p><ul><li><a href="http://assafstone.blogspot.com/2011/12/10-reasons-to-avoid-test-driven.html" target="_blank">http://assafstone.blogspot.com/2011/12/10-reasons-to-avoid-test-driven.html</a></li></ul><p>Interessante Graphiken zur Versionsverbreitung von Browsern und Plugins:</p><ul><li><a href="http://www.netmagazine.com/features/developers-guide-browser-adoption-rates" target="_blank">http://www.netmagazine.com/features/developers-guide-browser-adoption-rates</a></li></ul><p>Interne Informationen wie Datentypen in PHP aussehen: ZVAL und so weiter:</p><ul><li><a href="http://nikic.github.com/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html" target="_blank">http://nikic.github.com/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html</a></li></ul><h3>Zusammenfassung Adventskalender 2011 von Mayflower:</h3><p><a href="http://blog.mayflower.de/archives/802-09.12.-10-good-reasons-why-to-learn-a-css-meta-language-like-sass-or-less.html" target="_blank"><span id="more-4048"></span>09.12. 10 good reasons why to learn a css meta language like sass or less</a></p><p><a href="http://blog.mayflower.de/archives/804-10.12.-Loesungen-fuer-Debugging-von-Mobile-Web-Apps.html" target="_blank">10.12. Lösungen für Debugging von Mobile Web Apps</a></p><p><a href="http://blog.mayflower.de/archives/803-11.12.-Migrate-to-HTML5!.html" target="_blank">11.12.: Migrate to HTML5!</a></p><p><a href="http://blog.mayflower.de/archives/806-12.12.-Javascript-Metriken.html" target="_blank">12.12. Javascript Metriken</a></p><p><a href="http://blog.mayflower.de/archives/811-13.12.-Profiling-mit-xhprof.html" target="_blank">13.12. Profiling mit xhprof</a></p><p><a href="http://blog.mayflower.de/archives/813-14.12.-Backbone-VS-Knockout-VS-JavaScriptMVC.html" target="_blank">14.12. Backbone VS Knockout VS JavaScriptMVC</a></p><p><a href="http://blog.mayflower.de/archives/785-15.12.-Using-custom-annotations-in-PHP.html" target="_blank">15.12. Using custom annotations in PHP</a></p><p><a href="http://blog.mayflower.de/archives/815-16.12.-Eine-Einfuehrung-in-Behavior-Driven-Development.html" target="_blank">16.12. Eine Einführung in Behavior Driven Development</a></p><p><a href="http://blog.mayflower.de/archives/808-17.12.-Zend-Framework-1-vs.-Symfony2.html" target="_blank">17.12. Zend Framework (1) vs. Symfony2</a></p><p><a href="http://blog.mayflower.de/archives/814-18.12.-Cloud2Go-Services-for-your-web-development.html" target="_blank">18.12. Cloud2Go Services for your web development</a></p><p><a href="http://blog.mayflower.de/archives/818-20.12.-JSHint-das-bessere-JSLint.html" target="_blank">20.12. JSHint &#8211; das bessere JSLint?</a></p><p><a href="http://blog.mayflower.de/archives/817-21.12.-Agile-Developer-Skills-ADS.html" target="_blank">21.12. Agile Developer Skills (ADS)</a></p><p><a href="http://blog.mayflower.de/archives/821-22.12.-Zend-Framework-und-BackboneJs.html" target="_blank">22.12. Zend Framework und BackboneJs</a></p><p><a href="http://blog.mayflower.de/archives/820-23.12.-Verpacktes-in-PHP.html" target="_blank">23.12. Verpacktes in PHP</a></p><p><a href="http://blog.mayflower.de/archives/819-24.12.-PHP-and-the-Lean-Startup.html" target="_blank">24.12. PHP and the Lean Startup</a></p><h3>Zusammenfassung PHP Advent 2011:</h3><p><a href="http://phpadvent.org/2011/better-object-oriented-arrays-by-ryan-parman" target="_blank">10.12. Better Object-Oriented Arrays</a></p><p><a href="http://phpadvent.org/2011/out-with-the-old-by-maggie-nelson" target="_blank">11.12. Out with the Old</a></p><p><a href="http://phpadvent.org/2011/bake-cookies-like-a-chef-by-michael-nitschinger" target="_blank">12.12. Bake Cookies Like a Chef</a></p><p><a href="http://phpadvent.org/2011/dont-forget-the-front-by-beth-tucker-long" target="_blank">13.12 Don’t Forget the Front</a></p><p><a href="http://phpadvent.org/2011/nightmare-before-last-christmas-by-jeremy-kendall" target="_blank">14.12. Nightmare Before (Last) Christmas</a></p><p><a href="http://phpadvent.org/2011/cross-origin-ajax-with-cors-by-david-walsh" target="_blank">15.12. Cross-Origin Ajax with CORS</a></p><p><a href="http://phpadvent.org/2011/cracks-in-the-foundation-by-gwynne-raskind" target="_blank">16.12. Cracks in the Foundation</a></p><p><a href="http://phpadvent.org/2011/php-for-all-the-things-by-matt-graham" target="_blank">17.12. PHP for All the Things</a></p><p><a href="http://phpadvent.org/2011/simplifying-commerce-for-small-business-by-ben-ramsey" target="_blank">18.12. Simplifying Commerce for Small Business</a></p><p><a href="http://phpadvent.org/2011/egomaniacal-and-scalable-apps-by-david-coallier" target="_blank">19.12. Egomaniacal and Scalable Apps</a></p><p><a href="http://phpadvent.org/2011/code-for-the-users-not-for-the-spec-by-drew-mclellan" target="_blank">20.12. Code for the Users, Not for the Spec</a></p><p><a href="http://phpadvent.org/2011/social-driven-development-by-chris-cornutt" target="_blank">21.12. Social-Driven Development</a></p><p><a href="http://phpadvent.org/2011/keep-the-front-in-the-front-by-rachel-andrew" target="_blank">22.12. Keep the Front in the Front</a></p><p><a href="http://phpadvent.org/2011/look-ma-no-passwords-by-dan-mills" target="_blank">23.12. Look Ma! No Passwords!</a></p><p><a href="http://phpadvent.org/2011/facilitating-development-environment-consistency-by-jeff-loiselle" target="_blank">24.12. Facilitating Development Environment Consistency</a></p><h3>Zusammenfassung Webkrauts CSS Adventskalender 2011:</h3><p><a href="http://www.webkrauts.de/2011/12/11/schema-org-sieht-so-das-web-3-0-aus/" target="_blank">11.12. schema.org: Sieht so das Web 3.0 aus?</a></p><p><a href="http://www.webkrauts.de/2011/12/12/der-aktuelle-stand-der-dinge-im-mobile-web-development/" target="_blank">12.12. Der aktuelle Stand der Dinge im Mobile Web Development</a></p><p><a href="http://www.webkrauts.de/2011/12/13/serverseitiges-javascript-mit-node-js/" target="_blank">13.12. Serverseitiges JavaScript mit node.js</a></p><p><a href="http://www.webkrauts.de/2011/12/14/webworking-unter-linux/" target="_blank">14.12. Webworking unter Linux</a></p><p><a href="http://www.webkrauts.de/2011/12/15/schnelltest-zur-barrierefreiheit/" target="_blank">15.12. Schnelltest zur Barrierefreiheit</a></p><p><a href="http://www.webkrauts.de/2011/12/16/codekit-der-alleskoenner-unter-den-tools-fuer-frontendentwickler/" target="_blank">16.12. CodeKit – Der Alleskönner unter den Tools für Frontendentwickler</a></p><p><a href="http://www.webkrauts.de/2011/12/17/zwei-die-zusammengehoeren-seo-und-informationsarchitektur-teil-1/" target="_blank">17.12. Zwei, die zusammengehören: SEO und Informationsarchitektur (Teil 1)</a></p><p><a href="http://www.webkrauts.de/2011/12/18/zwei-die-zusammengehoeren-seo-und-informationsarchitektur-teil-2/" target="_blank">18.12. Zwei, die zusammengehören: SEO und Informationsarchitektur (Teil 2)</a></p><p><a href="http://www.webkrauts.de/2011/12/19/css3-pie-dekoratives-mit-und-ohne-css3/" target="_blank">19.12. CSS3 PIE | Dekoratives mit und ohne CSS3</a></p><p><a href="http://www.webkrauts.de/2011/12/20/css-3-im-praxistest-transition/" target="_blank">20.12. CSS 3 im Praxistest: Transition</a></p><p><a href="http://www.webkrauts.de/2011/12/21/ein-blick-durch-den-viewport/" target="_blank">21.12. Ein Blick durch den Viewport</a></p><p><a href="http://www.webkrauts.de/2011/12/22/dreimal-css4-zum-mitnehmen/" target="_blank">22.12. Dreimal CSS4 zum Mitnehmen</a></p><p><a href="http://www.webkrauts.de/2011/12/23/bauen-wie-die-ameisen/" target="_blank">23.12. Bauen wie die Ameisen</a></p><p><a href="http://www.webkrauts.de/2011/12/24/vorschau-auf-einen-relaunch/" target="_blank">24.12. Vorschau auf einen Relaunch</a></p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/adventskalenderartikel-01-12-10-12' rel='bookmark' title='Adventskalenderartikel 01.12. &#8211; 10.12.'>Adventskalenderartikel 01.12. &#8211; 10.12.</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-20' rel='bookmark' title='Linkpool Nummer 20'>Linkpool Nummer 20</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-23' rel='bookmark' title='Linkpool Nummer 23'>Linkpool Nummer 23</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/linkpool-nummer-27-adventskalenderartikel-10-12-%e2%80%93-24-12/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>HashDoS Angriff legt (unter anderem) PHP lahm</title><link>http://www.phpgangsta.de/hashdos-angriff-legt-unter-anderem-php-lahm</link> <comments>http://www.phpgangsta.de/hashdos-angriff-legt-unter-anderem-php-lahm#comments</comments> <pubDate>Wed, 28 Dec 2011 23:32:44 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[#hashdos]]></category> <category><![CDATA[Security]]></category> <category><![CDATA[Sicherheit]]></category> <category><![CDATA[Suhosin]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4109</guid> <description><![CDATA[Ich bin leider die letzten 2 Tage nur wenige Stunden dazu gekommen die Live-Streams vom 28. Chaos Communication Congress (28C3) zu schauen, aber bzgl. PHP ist heute Nachmittag ein interessanter Talk gehalten worden mit dem Thema Effective Denial of Service attacks against web application platforms dem ich hier einen kurzen Artikel widmen werde. Es geht darum [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/pdt-2-1-unter-windows-mit-subclipse-svn-client' rel='bookmark' title='PDT 2.1 unter Windows mit Subclipse SVN Client'>PDT 2.1 unter Windows mit Subclipse SVN Client</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Ich bin leider die letzten 2 Tage nur wenige Stunden dazu gekommen die <a href="http://28c3.fem-net.de/" target="_blank">Live-Streams</a> vom <a href="http://events.ccc.de/congress/2011/wiki/Main_Page" target="_blank">28. Chaos Communication Congress (28C3) </a>zu schauen, aber bzgl. PHP ist heute Nachmittag ein interessanter Talk gehalten worden mit dem Thema <a href="http://events.ccc.de/congress/2011/Fahrplan/events/4680.en.html" target="_blank">Effective Denial of Service attacks against web application platforms</a> dem ich hier einen kurzen Artikel widmen werde.</p><p>Es geht darum wie PHP (und die anderen anfälligen Sprachen auch) Hash-Tabellen erstellen und verwalten. Die hier interessante Hash-Tabelle ist das $_POST Array, das man von außen füllen kann, und das anfällig ist wenn man nur genügend &#8220;passende&#8221; Datensätze reinfüllt. Der Algorithmus der die Hash-Tabelle befüllt wird nämlich langsamer sobald Kollisionen der Keys auftreten. Schickt man also beispielsweise 300KB POST-Daten an ein PHP-Script ist eine schnelle CPU damit ca. 30 Sekunden unter Volllast. Bei 8MB (dem Standard-Maximum für POST-Daten in der php.ini) wären es immerhin schon 5 Stunden, die die CPU benötigt um die Hash-Table zu füllen. Man kann also mit einer relativ kleinen DSL-Leitung einigen Schaden anrichten. Mit einer Gigabit-Leitung kann man so 10.000 CPU-Kerne dauerhaft beschäftigen.</p><p><span id="more-4109"></span>Etwas Abhilfe schaffen da die Einstellungen max_input_time und max_execution_time, die je nach Distribution 30 Sekunden, 60 Sekunden bzw. nicht beschränkt sind. Man müßte also mehrere kleine Anfragen schicken und kann nicht die 8MB ausnutzen. mit ca. 500KB kann man einen CPU-Kern dann etwa eine Minute beschäftigen.</p><p>Das Problem ist wohl seit 2003 bekannt, Perl hat es damals behoben indem in die Generierung des Hash-Index auch Zufall mit einfließt, und nicht nur der Key die Hash-Position bestimmt. Neben PHP sind übrigens auch Java, Apache Tomcat, Apache Geronimo, Jetty, Oracle Glassfish, ASP.NET, Python, Plone, CRuby 1.8, JRuby, Rubinius und v8 (Node.JS) betroffen (<a href="http://www.ocert.org/advisories/ocert-2011-003.html" target="_blank">Details zu betroffenen und gefixten Versionen</a>).</p><p>Abhilfe schafft beispielsweise die <a href="http://www.hardened-php.net/suhosin/" target="_blank">PHP-Extension Suhosin</a>, mit der die <a href="http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_vars" target="_blank">Anzahl an POST-Variablen</a> beschränkt werden kann (Standard ist 200). Seit 3 Wochen gibt es auch einen <a href="http://svn.php.net/viewvc?view=revision&amp;revision=321003" target="_blank">Patch für PHP</a> der eine neue php.ini Variable max_input_vars (Standard 1000) einführt, dieser Patch wird enthalten sein in PHP &gt;=5.3.9 und &gt;=5.4.0 RC4</p><p>Ein <a href="https://cryptanalysis.eu/blog/2011/12/28/effective-dos-attacks-against-web-application-plattforms-hashdos/" target="_blank">sehr hilfreicher Artikel bei cryptanalysis.eu</a> erklärt noch einige Details. Natürlich empfiehlt es sich auch das <a href="http://www.youtube.com/watch?v=_EEhviEO1Vo" target="_blank">aufgezeichnete Video des Talks</a> zu schauen. Aktuell ist es ein PreRelease, das finale Video wird wahrscheinlich erst morgen oder übermorgen erscheinen nehme ich an.</p><p>Aktuell werden wohl noch keine großflächigen Angriffe beobachtet, aber wer auf der sicheren Seite sein will installiert sich Suhosin falls nicht eh schon geschehen. Aber Achtung, einige Restriktionen sind zu streng und könnten die Benutzung der Applikation beeinflussen die auf hohe Werte einiger Einstellungen angewiesen ist, also bitte vorher testen. Oder noch etwas gedulden und bald auf PHP 5.3.9 bzw. PHP 5.4.0 updaten.</p><p><strong><em>EDIT: php.net ist langsam bzw. zeitweise nicht erreichbar&#8230;</em></strong></p><p><strong>EDIT: Der <a href="http://ftp.snt.utwente.nl/pub/misc/28c3/mp4-h264-HQ/28c3-4680-en-effective_dos_attacks_against_web_application_platforms_h264.mp4.torrent" target="_blank">torrent zum offiziellen Release des Videos</a>.</strong></p><p><strong>EDIT: <a href="http://koto.github.com/blog-kotowicz-net-examples/hashcollision/kill.html" target="_blank">Demo-Webseite</a> incl. <a href="https://github.com/koto/blog-kotowicz-net-examples/tree/master/hashcollision" target="_blank">Quelltext</a></strong></p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/pdt-2-1-unter-windows-mit-subclipse-svn-client' rel='bookmark' title='PDT 2.1 unter Windows mit Subclipse SVN Client'>PDT 2.1 unter Windows mit Subclipse SVN Client</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/hashdos-angriff-legt-unter-anderem-php-lahm/feed</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>High Performance: Caching (reloaded) mit PHP</title><link>http://www.phpgangsta.de/high-performance-caching-reloaded-mit-php</link> <comments>http://www.phpgangsta.de/high-performance-caching-reloaded-mit-php#comments</comments> <pubDate>Mon, 19 Dec 2011 08:46:52 +0000</pubDate> <dc:creator>Oliver</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[APC]]></category> <category><![CDATA[Cache]]></category> <category><![CDATA[Caching]]></category> <category><![CDATA[Cherokee]]></category> <category><![CDATA[wordpress]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4062</guid> <description><![CDATA[Gastartikel von Oliver Sperke. Ich bin 35 Jahre alt und seit 10 Jahren selbständiger Webentwickler. Mein Fokus liegt dabei auf der Erstellung, Beratung und Optimierung in den Bereichen High Performance, Usability und Sicherheit in den gängigsten Internetsprachen: PHP, HTML, Javascript und CSS. Nach langem Arbeiten an einem Projekt fängt der ambitionierte Entwickler an, zu testen, [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/php-in_array-die-performance-bremse' rel='bookmark' title='PHP in_array() die Performance-Bremse'>PHP in_array() die Performance-Bremse</a></li></ol>]]></description> <content:encoded><![CDATA[<p><em>Gastartikel von Oliver Sperke.</em></p><p><em>Ich bin 35 Jahre alt und seit 10 Jahren selbständiger Webentwickler. Mein Fokus liegt dabei auf der Erstellung, Beratung und Optimierung in den Bereichen High Performance, Usability und Sicherheit in den gängigsten Internetsprachen: PHP, HTML, Javascript und CSS.</em></p><p>Nach langem Arbeiten an einem Projekt fängt der ambitionierte Entwickler an, zu testen, wie sich seine dynamische Internetseite unter Last verhält. Da ja jeder von uns von Millionen Besuchern träumt, will man natürlich auch wissen, wie sich Millionen von Besucher anfühlen und ob unser „kleines Kunstwerk“ davon genau so begeistert wäre wie wir. Dynamische Webseiten sind toll, allerdings hat der gemeine Internetserver ein großes Problem damit. Die Erzeugung ist meist sehr aufwendig. Daten müssen aus Datenbanken geholt werden, Berechnungen wollen berechnet werden und Blogeinträge müssen wie Blogeinträge aussehen.</p><p>Seit Jahren hat sich eine simple Technik etabliert, die diese gequälten Webserver entlastet. Jeder fortgeschrittene Entwickler kennt und liebt sie, weil sie so schön einfach und universal einsetzbar ist: <em>*trommelwirbel*</em> <strong><a href="http://de.wikipedia.org/wiki/Cache" target="_blank">Das Caching</a></strong> <em>*tusch*</em>. Da aber Caching an sich ein uralter Hut ist, will ich Euch zeigen, wie Ihr evtl. Eure Performance mit minimalen Änderungen mehr als verdoppeln könnt.</p><h2>Am Anfang war der Benchmark</h2><p><span id="more-4062"></span>Nehmen wir als Beispiel eine ganz normale <a href="http://wordpress.org/" target="_blank">WordPress</a> Installation mit dem <a href="http://wordpress.org/extend/plugins/demo-data-creator/" target="_blank">üblichem Inhalt</a>. WordPress ist umfangreich, es ist komfortabel, es ist leicht verständlich und es ist langsam. Da aber in den wenigstens Blogs sekündlich neue Beiträge und/oder Kommentare geschrieben werden, dafür aber häufige Aufrufe nicht unüblich sind, drängt sich uns hier das Caching geradezu auf. Natürlich gibt es <a href="http://wordpress.org/extend/plugins/w3-total-cache/" target="_blank">einige</a> <a href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">gute</a> <a href="http://wordpress.org/extend/plugins/cachify/" target="_blank">Plugins</a> dafür, die die verschiedenen Möglichkeiten des Cachings wunderbar abdecken. Aber um die soll es heute zur Abwechslung einmal nicht gehen. Ich will Euch ja nicht mit den „ollen Kamellen“ langweilen.</p><p>Um die Geschwindigkeit zu testen brauchen wir natürlich Hilfe in Form eines wunderbaren Programm Namens <a href="http://httpd.apache.org/docs/2.0/programs/ab.html" target="_blank">Apachebench</a>. Dieses ist ein sehr einfach gehaltenes, aber mächtiges Kommandozeilenprogramm. Es macht im Prinzip nichts anderes als eine vorgegebene Seite immer wieder und wieder abzurufen. Dabei merkt es sich Start und Endzeitpunkt und berechnet daraus die Geschwindigkeit, mit der unsere Anfragen beantwortet wurden. Da wir immer noch mit dynamischen Daten arbeiten, starten wir einen ersten vorsichtigen Test. Wir rufen die index.php unserer WordPress Installation zunächst 1000 Mal (-n1000) auf mit je 4 parallelen Zugriffen (-c4). Ich habe 4 gewählt, weil mein Testsystem vier Prozessorkerne hat. So ist ständig jeder Prozessorkern beschäftigt. Die gesamten Daten des Testsystems findet Ihr am Ende des Artikels. Ich gebe bei der Ausgabe von Apachebench immer nur die wichtigen Daten an. Die gesamte Ausgabe ist natürlich umfangreicher.</p><pre class="brush: bash; title: ; notranslate">
ab -n1000 -c4 http://phpgangsta.x-blogs.org/
</pre><pre class="brush: plain; light: true; title: ; notranslate">
Server Software:        Cherokee
Server Hostname:        phpgangsta.x-blogs.org
Server Port:            80

Document Path:          /
Document Length:        18612 bytes

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

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

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

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

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

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

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

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

Software:
- Debian 6.0.3
- Cherokee Web Server 1.2.101
- PHP 5.3.8 (php-fpm)
- APC 3.1.9
</pre><br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/php-in_array-die-performance-bremse' rel='bookmark' title='PHP in_array() die Performance-Bremse'>PHP in_array() die Performance-Bremse</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/high-performance-caching-reloaded-mit-php/feed</wfw:commentRss> <slash:comments>33</slash:comments> </item> <item><title>Kleine Einführung in die YouTube API</title><link>http://www.phpgangsta.de/kleine-einfuhrung-in-die-youtube-api</link> <comments>http://www.phpgangsta.de/kleine-einfuhrung-in-die-youtube-api#comments</comments> <pubDate>Wed, 14 Dec 2011 10:08:57 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[YouTube]]></category> <category><![CDATA[YouTube API]]></category> <category><![CDATA[zend framework]]></category> <category><![CDATA[Zend_Gdata_YouTube]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4000</guid> <description><![CDATA[So, heute ist die YouTube API dran, nachdem ich letzte Woche die SlideShare API vorgestellt hatte. Mit Hilfe der YouTube Data API ist es möglich Videos hochzuladen, nach Videos zu suchen und Kommentare abzurufen. Man kann sich mit der API auch &#8220;einloggen&#8221; und Dinge tun die man als eingeloggter User machen kann, beispielsweise als dieser [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/php-und-zend-framework-video-podcasts-und-serien' rel='bookmark' title='PHP und Zend Framework Video-Podcasts und -Serien'>PHP und Zend Framework Video-Podcasts und -Serien</a></li><li><a href='http://www.phpgangsta.de/slides-und-videos-der-velocity-europe-2011' rel='bookmark' title='Slides und Videos der Velocity Europe 2011'>Slides und Videos der Velocity Europe 2011</a></li></ol>]]></description> <content:encoded><![CDATA[<p>So, heute ist die YouTube API dran, nachdem ich letzte Woche die <a href="http://www.phpgangsta.de/zugriff-auf-die-slideshows-bei-slideshare-via-zend_service_slideshare" target="_blank">SlideShare API</a> vorgestellt hatte. Mit Hilfe der <a href="http://code.google.com/intl/de-DE/apis/youtube/getting_started.html#data_api" target="_blank">YouTube Data API</a> ist es möglich Videos hochzuladen, nach Videos zu suchen und Kommentare abzurufen. Man kann sich mit der API auch &#8220;einloggen&#8221; und Dinge tun die man als eingeloggter User machen kann, beispielsweise als dieser User Videos hochladen, Playlisten bearbeiten usw.</p><p>Da wir uns die Hände nicht unnötig schmutzig machen wollen nutzen wir wieder Zend-Klassen dafür. Ich zeige hier die Verwendung von Zend_Gdata_YouTube, wenn man das ganze Zend Framework scheut kann man die <a href="http://framework.zend.com/manual/en/zend.gdata.html" target="_blank">Zend_Gdata Klassen</a> aber <a href="http://framework.zend.com/download/gdata" target="_blank">auch einzeln downloaden</a>. PHP 5.1.4 und Zend_Gdata &gt; 1.7.7 werden aktuell benötigt.</p><p>Für die öffentlichen Funktionen benötigen wir keine Authentifizierung, wir können direkt loslegen. Wenn die YouTube VideoID bekannt ist kann man Informationen zum betreffenden Video wie folgt abrufen:</p><p><span id="more-4000"></span></p><pre class="brush: php; title: ; notranslate">&lt;?
// loader or autoloader here
require_once 'Zend/Loader.php'; // the Zend dir must be in your include_path
Zend_Loader::loadClass('Zend_Gdata_YouTube');

$yt = new Zend_Gdata_YouTube();
$yt-&gt;setMajorProtocolVersion(2);
$entry = $yt-&gt;getVideoEntry('oebqlzblfyo');

printVideoEntry($entry);</pre><p>Die printVideoEntry() Funktion zeigt in diesem Fall Informationen des Zend_Gdata_YouTube_VideoEntry Objekts an:</p><pre class="brush: php; title: ; notranslate">function printVideoEntry($videoEntry)
{
    // the videoEntry object contains many helper functions
    // that access the underlying mediaGroup object
    echo 'Video: ' . $videoEntry-&gt;getVideoTitle() . &quot;\n&quot;;
    echo 'Video ID: ' . $videoEntry-&gt;getVideoId() . &quot;\n&quot;;
    echo 'Updated: ' . $videoEntry-&gt;getUpdated() . &quot;\n&quot;;
    echo 'Description: ' . $videoEntry-&gt;getVideoDescription() . &quot;\n&quot;;
    echo 'Category: ' . $videoEntry-&gt;getVideoCategory() . &quot;\n&quot;;
    echo 'Tags: ' . implode(&quot;, &quot;, $videoEntry-&gt;getVideoTags()) . &quot;\n&quot;;
    echo 'Watch page: ' . $videoEntry-&gt;getVideoWatchPageUrl() . &quot;\n&quot;;
    echo 'Flash Player Url: ' . $videoEntry-&gt;getFlashPlayerUrl() . &quot;\n&quot;;
    echo 'Duration: ' . $videoEntry-&gt;getVideoDuration() . &quot;\n&quot;;
    echo 'View count: ' . $videoEntry-&gt;getVideoViewCount() . &quot;\n&quot;;
    echo 'Rating: ' . $videoEntry-&gt;getVideoRatingInfo() . &quot;\n&quot;;
    echo 'Geo Location: ' . $videoEntry-&gt;getVideoGeoLocation() . &quot;\n&quot;;
    echo 'Recorded on: ' . $videoEntry-&gt;getVideoRecorded() . &quot;\n&quot;;

    // see the paragraph above this function for more information on the
    // 'mediaGroup' object. in the following code, we use the mediaGroup
    // object directly to retrieve its 'Mobile RSTP link' child
    foreach ($videoEntry-&gt;mediaGroup-&gt;content as $content) {
        if ($content-&gt;type === &quot;video/3gpp&quot;) {
            echo 'Mobile RTSP link: ' . $content-&gt;url . &quot;\n&quot;;
        }
    }

    echo &quot;Thumbnails:\n&quot;;
    $videoThumbnails = $videoEntry-&gt;getVideoThumbnails();

    foreach($videoThumbnails as $videoThumbnail) {
        echo $videoThumbnail['time'] . ' - ' . $videoThumbnail['url'];
        echo ' height=' . $videoThumbnail['height'];
        echo ' width=' . $videoThumbnail['width'] . &quot;\n&quot;;
    }
}</pre><p>Die Ausgabe sieht dann so aus:</p><pre class="brush: plain; title: ; notranslate">Video: Velocity Europe, Artur Bergman, &quot;Full Stack Awareness&quot;
Video ID: oebqlzblfyo
Updated: 2011-12-08T16:06:11.000Z
Description: Artur Bergman  VP Engineering and Operations, Wikia/Fastly

Performance and operability doesn't come from simply focusing on a single part of your application or infrastructure. They come from having a systemic view of what makes your stack work, what could bottleneck it, and what could bring it down. I'll talk about this journey from kernel to continents.
Category: Tech
Tags: velocityconf, europe, 2011
Watch page: http://www.youtube.com/watch?v=oebqlzblfyo&amp;feature=youtube_gdata_player
Flash Player Url: http://www.youtube.com/v/oebqlzblfyo?version=3&amp;f=videos&amp;app=youtube_gdata
Duration: 1090
View count: 2883
Rating: Array
Geo Location:
Recorded on:
Mobile RTSP link: rtsp://v8.cache2.c.youtube.com/CiILENy73wIaGQkqf-U2l-rmoRMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
Mobile RTSP link: rtsp://v4.cache3.c.youtube.com/CiILENy73wIaGQkqf-U2l-rmoRMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
Thumbnails:
00:09:05 - http://i.ytimg.com/vi/oebqlzblfyo/default.jpg height=90 width=120
 - http://i.ytimg.com/vi/oebqlzblfyo/hqdefault.jpg height=360 width=480
00:04:32.500 - http://i.ytimg.com/vi/oebqlzblfyo/1.jpg height=90 width=120
00:09:05 - http://i.ytimg.com/vi/oebqlzblfyo/2.jpg height=90 width=120
00:13:37.500 - http://i.ytimg.com/vi/oebqlzblfyo/3.jpg height=90 width=120</pre><p>Es ist auch möglich einige Standard-Feeds abzurufen, wie beispielsweise recently_features, most_viewed, top_rated, top_favorites usw. Und das geht so:</p><pre class="brush: php; title: ; notranslate">printVideoFeed($yt-&gt;getRecentlyFeaturedVideoFeed());</pre><p>Die printVideoFeed() Funktion ist einfach eine Schleife über die Ergebnisse:</p><pre class="brush: php; title: ; notranslate">function printVideoFeed($videoFeed)
{
    $count = 1;
    foreach ($videoFeed as $videoEntry) {
        echo &quot;Entry # &quot; . $count . &quot;\n&quot;;
        printVideoEntry($videoEntry);
        echo &quot;\n&quot;;
        $count++;
    }
}</pre><p>Oder aber alle ähnlichen Videos zum oben gezeigten:</p><pre class="brush: php; title: ; notranslate">printVideoFeed($yt-&gt;getRelatedVideoFeed('oebqlzblfyo'));</pre><p>Oder alle Videos eines bestimmten Users:</p><pre class="brush: php; title: ; notranslate">printVideoFeed($yt-&gt;getuserUploads('OreillyMedia'));</pre><p>Alle Antworten die Feeds betreffen liefern standardmäßig erstmal maximal 25 Ergebnisse zurück. Möchte man &#8220;weiterblättern&#8221; kann man das so tun:</p><pre class="brush: php; title: ; notranslate">try {
  $nextFeed = $videoFeed-&gt;getNextFeed();
} catch (Zend_Gdata_App_Exception $e) {
  echo $e-&gt;getMessage() . &quot;\n&quot;;
}</pre><p>Gibt es keine nächstes Seite wird eine Exception geworfen.</p><p>Eine Suche nach einem Suchstring sieht wie folgt aus:</p><pre class="brush: php; title: ; notranslate">$query = $yt-&gt;newVideoQuery();
$query-&gt;videoQuery = 'phpunit test';
$query-&gt;startIndex = 10;
$query-&gt;maxResults = 20;
$query-&gt;orderBy = 'viewCount';
$videoFeed = $yt-&gt;getVideoFeed($query-&gt;getQueryUrl(2));

printVideoFeed($videoFeed);</pre><p>Für alle &#8220;non-public&#8221; Zugriffe auf die API benötigt man einen <a href="http://code.google.com/apis/youtube/dashboard/" target="_blank">Developer-Account</a>, mit dem dann ein API-Key generiert werden kann. Das betrifft beispielsweise den Video-Upload, Kommentare und Ratings setzen, Nachrichten lesen, Playlists bearbeiten und vielem mehr. Im <a href="http://code.google.com/intl/de-DE/apis/youtube/2.0/developers_guide_php.html" target="_blank">YouTube Developer API Guide</a> befinden sich noch viele weitere Informationen zur API, genauso wie im <a href="http://framework.zend.com/manual/en/zend.gdata.youtube.html" target="_blank">Zend_Gdata_YouTube Manual</a>.</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/php-und-zend-framework-video-podcasts-und-serien' rel='bookmark' title='PHP und Zend Framework Video-Podcasts und -Serien'>PHP und Zend Framework Video-Podcasts und -Serien</a></li><li><a href='http://www.phpgangsta.de/slides-und-videos-der-velocity-europe-2011' rel='bookmark' title='Slides und Videos der Velocity Europe 2011'>Slides und Videos der Velocity Europe 2011</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/kleine-einfuhrung-in-die-youtube-api/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Adventskalenderartikel 01.12. &#8211; 10.12.</title><link>http://www.phpgangsta.de/adventskalenderartikel-01-12-10-12</link> <comments>http://www.phpgangsta.de/adventskalenderartikel-01-12-10-12#comments</comments> <pubDate>Sat, 10 Dec 2011 12:34:30 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Javascript]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Advent 2011]]></category> <category><![CDATA[Adventskalender]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3974</guid> <description><![CDATA[Heute gibts eine Menge Links zu Adventskalender-Blogartikeln. Jeden Tag ein Türchen, dahinter jeden Tag ein Artikel aus dem PHP- und Webumfeld. Viel Spass beim Lesen! Zusammenfassung Adventskalender 2011 von Mayflower: 01.12. CLOUD Transformation Model 02.12. PHP 5.3 Features in real life 03.12. Setting up an own QA Environment for Javascript 04.12. PDF nicht nur mit [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p>Heute gibts eine Menge Links zu Adventskalender-Blogartikeln. Jeden Tag ein Türchen, dahinter jeden Tag ein Artikel aus dem PHP- und Webumfeld. Viel Spass beim Lesen!</p><h3>Zusammenfassung Adventskalender 2011 von Mayflower:</h3><p><a href="http://blog.mayflower.de/archives/783-01.12.-CLOUD-Transformation-Model.html" target="_blank">01.12. CLOUD Transformation Model</a></p><p><a href="http://blog.mayflower.de/archives/786-02.12.-PHP-5.3-Features-in-real-life.html" target="_blank">02.12. PHP 5.3 Features in real life</a></p><p><a href="http://blog.mayflower.de/archives/788-03.12.-Setting-up-an-own-QA-Environment-for-Javascript.html" target="_blank">03.12. Setting up an own QA Environment for Javascript</a></p><p><a href="http://blog.mayflower.de/archives/791-04.12.-PDF-nicht-nur-mit-PHP.html" target="_blank">04.12. PDF nicht nur mit PHP</a></p><p><a href="http://blog.mayflower.de/archives/792-05.12.-Doctrine-2.html" target="_blank">05.12. Doctrine 2</a></p><p><a href="http://blog.mayflower.de/archives/799-06.12.-Doctrine-2-Zend-Framework-Integration.html" target="_blank">06.12. Doctrine 2 &#8211; Zend Framework Integration</a></p><p><a href="http://blog.mayflower.de/archives/800-07.12.-One-click-Deployment.html" target="_blank">07.12. One-click Deployment</a></p><p><a href="http://blog.mayflower.de/archives/801-08.12.-Agilere-Datenbankentwicklung.html" target="_blank">08.12. Agilere Datenbankentwicklung</a></p><h3>Zusammenfassung PHP Advent 2011:</h3><p><a href="http://phpadvent.org/2011/because-its-fun-by-derek-sivers" target="_blank">01.12. Because It’s Fun!</a></p><p><a href="http://phpadvent.org/2011/more-than-just-style-by-laura-beth-denker" target="_blank">02.12. More Than Just Style</a></p><p><a href="http://phpadvent.org/2011/reduced-friction-deployment-by-chris-hartjes" target="_blank">03.12. Reduced-Friction Deployment</a></p><p><a href="http://phpadvent.org/2011/better-than-the-rest-by-rob-allen" target="_blank">04.12. Better Than the Rest</a></p><p><a href="http://phpadvent.org/2011/a-stitch-in-time-saves-nine-by-paul-jones" target="_blank">05.12. A Stitch in Time Saves Nine</a></p><p><a href="http://phpadvent.org/2011/dates-and-times-by-evert-pot" target="_blank">06.12. Dates and Times</a></p><p><a href="http://phpadvent.org/2011/twilio-in-two-minutes-by-elizabeth-naramore" target="_blank">07.12. Twilio in Two Minutes</a></p><p><a href="http://phpadvent.org/2011/integration-testing-by-wez-furlong" target="_blank">08.12. <em>Integration Testing</em></a></p><p><a href="http://phpadvent.org/2011/merry-error-handling-by-samer-atiani" target="_blank">09.12. Merry Error Handling</a></p><h3>Zusammenfassung Webkrauts CSS Adventskalender 2011:</h3><p><a href="http://www.webkrauts.de/2011/12/01/wireframes-fuer-startseiten/" target="_blank">01.12. Wireframes für Startseiten</a></p><p><a href="http://www.webkrauts.de/2011/12/02/konzentriert-und-strukturiert-texten/" target="_blank">02.12. Konzentriert und strukturiert Texten</a></p><p><a href="http://www.webkrauts.de/2011/12/03/one-button-to-rule-them-all/" target="_blank">03.12. One Button to rule them all</a></p><p><a href="http://www.webkrauts.de/2011/12/04/sass-compas/" target="_blank">04.12. Effiziente CSS-Entwicklung mit Sass und Compass (Teil 1)</a></p><p><a href="http://www.webkrauts.de/2011/12/05/sass-compass2/" target="_blank">05.12. Effiziente CSS-Entwicklung mit Sass und Compass (Teil 2)</a></p><p><a href="http://www.webkrauts.de/2011/12/06/geschenke-fuer-geeks/" target="_blank">06.12. Geschenke für Geeks</a></p><p><a href="http://www.webkrauts.de/2011/12/07/mobile-usability-gebrauchstauglichkeit-fuer-unterwegs/" target="_blank">07.12. Mobile Usability – Gebrauchstauglichkeit für unterwegs</a></p><p><a href="http://www.webkrauts.de/2011/12/08/css-3-im-praxistest-multi-column-layout/" target="_blank">08.12. CSS 3 im Praxistest: Multi-column Layout</a></p><p><a href="http://www.webkrauts.de/2011/12/09/flickr-picasa-bildergalerie-mit-yql/" target="_blank">09.12. SELECT Bilder FROM Flickr OR PicasaWebAlbums WITH YQL FOR Bildergalerie</a></p><p><a href="http://www.webkrauts.de/2011/12/10/yql-bildergalerie-als-wordpress-plugin/" target="_blank">10.12. YQL-Bildergalerie als WordPress-Plugin</a></p><p>Es gibt noch weitere Adventskalender-Artikel, beispielsweise über CSS:</p><p><a href="http://24ways.org/" target="_blank">http://24ways.org/</a></p><p><a href="http://maddesigns.de/" target="_blank">http://maddesigns.de/</a> zusammen mit <a href="http://webstandard.kulando.de/" target="_blank">http://webstandard.kulando.de/</a></p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/adventskalenderartikel-01-12-10-12/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Zugriff auf die SlideShows bei SlideShare via Zend_Service_SlideShare</title><link>http://www.phpgangsta.de/zugriff-auf-die-slideshows-bei-slideshare-via-zend_service_slideshare</link> <comments>http://www.phpgangsta.de/zugriff-auf-die-slideshows-bei-slideshare-via-zend_service_slideshare#comments</comments> <pubDate>Mon, 05 Dec 2011 09:07:59 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[API]]></category> <category><![CDATA[SlideShare]]></category> <category><![CDATA[SlideShow]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4002</guid> <description><![CDATA[SlideShare hat eine API über die man auf die SlideShows zugreifen kann, man kann einzelne SlideShows abrufen und SlideShows nach Tags, Gruppen oder Usernamen suchen, und erhält dann jeweils Details wie Titel, Uploaddatum, Anzahl Views, Anzahl Downloads, EmbedCode und über ein Dutzend weitere Informationen. Es ist auch möglich neue SlideShows hochzuladen. Der Zugriff ist nicht [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/konstanten-klassenkonstanten-und-der-zugriff' rel='bookmark' title='Konstanten, Klassenkonstanten und der Zugriff'>Konstanten, Klassenkonstanten und der Zugriff</a></li></ol>]]></description> <content:encoded><![CDATA[<p>SlideShare hat eine API über die man auf die SlideShows zugreifen kann, man kann einzelne SlideShows abrufen und SlideShows nach Tags, Gruppen oder Usernamen suchen, und erhält dann jeweils Details wie Titel, Uploaddatum, Anzahl Views, Anzahl Downloads, EmbedCode und über ein Dutzend weitere Informationen. Es ist auch möglich neue SlideShows hochzuladen.</p><p>Der Zugriff ist nicht sonderlich schwer, man benötigt einen <a href="http://www.slideshare.net/developers/applyforapi" target="_blank">API-Schlüssel und ein Shared Secret </a>die man bei <a href="http://www.slideshare.net/developers" target="_blank">SlideShare im Entwicklerbereich</a> beantragen kann. Dann sendet man einfach GET bzw. POST Anfragen an bestimmte URLs, und bekommt XML zurück.</p><p>Am einfachsten geht es jedoch mit der Zend_Service_SlideShare Klasse aus dem Zend Framework:</p><p><span id="more-4002"></span></p><pre class="brush: php; title: ; notranslate">$slideShare = new Zend_Service_SlideShare(
    'XXXXXXXX',
    'XXXXXXXX',
    'PHPGangsta',
    'XXXXXXXX'
);
$slideShow = $slideShare-&gt;getSlideShow('10328838');

echo 'Title: '.$slideShow-&gt;getTitle().&quot;\n&quot;;
echo 'Description: '.$slideShow-&gt;getDescription().&quot;\n&quot;;
echo 'NumViews: '.$slideShow-&gt;getNumViews().&quot;\n&quot;;
echo 'PermaLink: '.$slideShow-&gt;getPermaLink().&quot;\n&quot;;
echo 'Tags: '.join(',', $slideShow-&gt;getTags()).&quot;\n&quot;;
echo 'ThumbnailUrl: '.$slideShow-&gt;getThumbnailUrl().&quot;\n&quot;;
echo 'EmbedCode: '.$slideShow-&gt;getEmbedCode().&quot;\n&quot;;</pre><p>Und schon hat man Informationen über die betreffende Präsentation, wie beispielsweise:</p><pre class="brush: plain; title: ; notranslate">Title: Caching and tuning fun for high scalability @ PHPTour
Description: Caching has been a 'hot' topic for a few years. But caching takes more than merely taking data and putting
it in a cache : the right caching techniques can improve performance and reduce load significantly. But we'll also look
at some major pitfalls, showing that caching the wrong way can bring down your site. If you're looking for a clear expla
nation about various caching techniques and tools like Memcached, Nginx and Varnish, as well as ways to deploy them in a
n efficient way, this talk is for you. In this tutorial, we'll start from a Zend Framework based site. We'll add caching
, begin to add servers and replace the standard LAMP stack, all while performing live benchmarks.
NumViews: 28
PermaLink: http://www.slideshare.net/wimg/caching-and-tuning-fun-for-high-scalability-phptour
Tags: tuning caching phptour memcache varnish
ThumbnailUrl: http://cdn.slidesharecdn.com/cachingandtuningfun-111125134026-phpapp02-thumbnail-2
EmbedCode: &lt;object width=&quot;425&quot; height=&quot;348&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0&quot;&gt;&lt;param name=&quot;src&quot; value=&quot;http://s3.amazonaws.com/slideshare/ssplayer.swf?id=10328838&amp;doc=cachingandtuningfun-111125134026-phpapp02&amp;branding=no&quot; /&gt;&lt;embed width=&quot;425&quot; height=&quot;348&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://s3.amazonaws.com/slideshare/ssplayer.swf?id=10328838&amp;doc=cachingandtuningfun-111125134026-phpapp02&amp;branding=no&quot; /&gt;&lt;/object&gt;
</pre><p>Wie oben bereits angedeutet gibt es bereits Methoden um SlideShows zu suchen via Tag, Username oder Gruppe:</p><pre class="brush: php; title: ; notranslate">$slideShows = $slideShare-&gt;getSlideShowsByTag('php');

$slideShows = $slideShare-&gt;getSlideShowsByUsername('wimg');

$slideShows = $slideShare-&gt;getSlideShowsByGroup('kollace');</pre><p>Die API kann aber noch mehr wie man in der <a href="http://www.slideshare.net/developers/documentation" target="_blank">API-Dokumentation</a> sehen kann, beispielsweise &#8220;normal&#8221; suchen per Query String. Da die Zend-Klasse das nicht anbietet habe ich das schnell eingebaut. Für das Zend Framework 2 habe ich bereits einen entsprechenden Pull-Request abgesetzt, hoffe es wird bald übernommen. Darin sind dann auch Änderungen bzgl. der API-Version (es gibt mittlerweile Version 2), es sind mehr Informationen im SlideShow Objekt abrufbar und einiges mehr.</p><pre class="brush: php; title: ; notranslate">$slideShows = $slideShare-&gt;searchSlideShow('php unit test');</pre><p>SlideShare macht es insgesamt sehr einfach die API zu benutzen, die Dokumentation ist gut. Mal sehen ob ich die Zeit finde und die restlichen fehlenden Methoden noch in das Zend Framework 2 einpflegen werde.</p><p>Hier meine abgeleitete Klasse mit der searchSlideShow() Methode:</p><pre class="brush: php; title: ; notranslate">&lt;?php

class PHPGangsta_Service_SlideShare extends Zend_Service_SlideShare
{
    const SERVICE_SEARCH_SLIDE_SHOW      = 'http://www.slideshare.net/api/2/search_slideshows';

    public function searchSlideShow($searchterm)
    {
        $timestamp = time();

        $params = array('api_key'       =&gt; $this-&gt;getApiKey(),
                        'ts'            =&gt; $timestamp,
                        'hash'          =&gt; sha1($this-&gt;getSharedSecret().$timestamp),
                        'detailed'      =&gt; 1,
                        'q'             =&gt; $searchterm);

        $cache = $this-&gt;getCacheObject();

        $cache_key = md5(&quot;__zendslideshare_cache_search_$searchterm&quot;);

        if(!$resultSlideshows = $cache-&gt;load($cache_key)) {
            $client = $this-&gt;getHttpClient();

            $client-&gt;setUri(self::SERVICE_SEARCH_SLIDE_SHOW);
            $client-&gt;setParameterPost($params);

            require_once 'Zend/Http/Client/Exception.php';
            try {
                $response = $client-&gt;request('POST');
            } catch(Zend_Http_Client_Exception $e) {
                require_once 'Zend/Service/SlideShare/Exception.php';
                throw new Zend_Service_SlideShare_Exception(&quot;Service Request Failed: {$e-&gt;getMessage()}&quot;, 0, $e);
            }

            $sxe = simplexml_load_string($response-&gt;getBody());

            if($sxe-&gt;getName() == &quot;SlideShareServiceError&quot;) {
                $message = (string)$sxe-&gt;Message[0];
                list($code, $error_str) = explode(':', $message);
                require_once 'Zend/Service/SlideShare/Exception.php';
                throw new Zend_Service_SlideShare_Exception(trim($error_str), $code);
            }

            if(!$sxe-&gt;getName() == 'Slideshows') {
                require_once 'Zend/Service/SlideShare/Exception.php';
                throw new Zend_Service_SlideShare_Exception('Unknown XML Repsonse Received');
            }

            $resultSlideshows = array();
            foreach ($sxe-&gt;Slideshow as $resultSlideshowNode) {
                $resultSlideshows[] = $this-&gt;_slideShowNodeToObject(clone $resultSlideshowNode);
            }

            $cache-&gt;save($resultSlideshows, $cache_key);
        }

        return $resultSlideshows;
    }
}</pre><br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/konstanten-klassenkonstanten-und-der-zugriff' rel='bookmark' title='Konstanten, Klassenkonstanten und der Zugriff'>Konstanten, Klassenkonstanten und der Zugriff</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/zugriff-auf-die-slideshows-bei-slideshare-via-zend_service_slideshare/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>ElePHPanten zu Weihnachten und Mayflower Adventskalender</title><link>http://www.phpgangsta.de/elephpanten-zu-weihnachten-und-mayflower-adventskalender</link> <comments>http://www.phpgangsta.de/elephpanten-zu-weihnachten-und-mayflower-adventskalender#comments</comments> <pubDate>Thu, 01 Dec 2011 09:19:37 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[elePHPant]]></category> <category><![CDATA[elePHPants]]></category> <category><![CDATA[Geschenk]]></category> <category><![CDATA[Mayflower]]></category> <category><![CDATA[Weihnachten]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3987</guid> <description><![CDATA[EDIT: Ich kann leider nicht mehr versprechen dass die Post schnell genug ist und den ElePHPanten pünktlich vor Weihnachten liefert, aber ich versuche es natürlich. Der 1. Dezember, noch 24 Tage bis Weihnachten. Wer hat schon alle Geschenke? Wahrscheinlich keiner Falls noch jemand ein Geschenk für sich selbst oder für Freund/Freundin oder Kollegen braucht, ich [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/elephpanten-zu-weihnachten' rel='bookmark' title='ElePHPanten zu Weihnachten?'>ElePHPanten zu Weihnachten?</a></li><li><a href='http://www.phpgangsta.de/toroo-die-elephpanten-sind-wieder-da' rel='bookmark' title='Töröö! Die ElePHPanten sind wieder da!'>Töröö! Die ElePHPanten sind wieder da!</a></li><li><a href='http://www.phpgangsta.de/erinnerung-elephpanten-und-phpstorm-20-rabatt' rel='bookmark' title='Erinnerung: ElePHPanten und PHPStorm Rabatt'>Erinnerung: ElePHPanten und PHPStorm Rabatt</a></li></ol>]]></description> <content:encoded><![CDATA[<p><strong><em>EDIT: Ich kann leider nicht mehr versprechen dass die Post schnell genug ist und den ElePHPanten pünktlich vor Weihnachten liefert, aber ich versuche es natürlich.</em></strong></p><p>Der 1. Dezember, noch 24 Tage bis Weihnachten. Wer hat schon alle Geschenke? Wahrscheinlich keiner <img src='http://www.phpgangsta.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> Falls noch jemand ein Geschenk für sich selbst oder für Freund/Freundin oder Kollegen braucht, ich habe wieder ElePHPanten Nachschub bekommen, der Andrang in den letzten Monaten war ja wirklich gewaltig und ich kam in Lieferschwierigkeiten, aber nun habe ich neue Dickhäuter für euch.</p><p>Die Preise und Portoinformationen <a href="http://www.phpgangsta.de/toroo-die-elephpanten-sind-wieder-da" target="_blank">sind gleich geblieben</a>:</p><p>Preise (für Deutschland):</p><ul><li>der kleine ElePHPant (blau<del></del>): 8 Euro (+2 Euro Versand)</li><li>der große ElePHPant (blau): 74 Euro (+8 Euro versicherter Versand)</li></ul><p>2 kleine ElePHPanten passen in eine Versandtasche, der Preis ist dann 18 Euro (8+8+2).</p><p>Die Versandkosten nach Österreich bzw. in die Schweiz betragen 4 Euro statt 2 Euro.</p><p>Die kleinen ElePHPanten verschicke ich unversichert als Warensendung, falls jemand einen versicherten Versand möchte bitte erwähnen, das Porto liegt dann bei 8 Euro als Päckchen. Letztes und auch dieses Jahr ist mir kein Verlust bekannt geworden.</p><p>Jeder Interessent unten im Kommentarbereich bekommt von mir eine E-Mail mit den Informationen zur Überweisung bzw. PayPal-Bezahlung.</p><p><strong>Mayflower Adventskalender:</strong></p><p>Heute startet im <a href="http://blog.mayflower.de/" target="_blank">Mayflower Blog</a> eine Adventskalender-Aktion. Jeden Tag gibt es einen hochwertigen neuen Artikel zu lesen. Heute beginnt <a href="http://blog.mayflower.de/archives/783-01.12.-CLOUD-Transformation-Model.html" target="_blank">Daniel Hallmann mit dem Thema CLOUD Transformation Model</a>. Es geht darum wie man Webapplikationen, die ihre Logik sowohl auf dem Client als auch auf dem Server bzw. in der Cloud betreiben sicherer machen kann.</p><p><img class="alignnone size-large wp-image-3515" style="border: 0pt none;" title="ElePHPantenhorde" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0057-1024x612.jpg" alt="" width="715" height="434" /></p><p><img class="alignnone size-large wp-image-3516" style="border: 0pt none;" title="ElePHPantenhorde" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0059-1024x612.jpg" alt="" width="715" height="426" /></p><p>Hier einige tolle Bilder des elePHPanten auf Flickr:<br /> <a href="http://www.flickr.com/search/?q=elephpant" target="_blank">http://www.flickr.com/search/?q=elephpant</a></p><p>Oder Googles Bildersuche:<br /> <a href="http://www.google.de/images?q=elephpant" target="_blank">http://www.google.de/images?q=elephpant</a></p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/elephpanten-zu-weihnachten' rel='bookmark' title='ElePHPanten zu Weihnachten?'>ElePHPanten zu Weihnachten?</a></li><li><a href='http://www.phpgangsta.de/toroo-die-elephpanten-sind-wieder-da' rel='bookmark' title='Töröö! Die ElePHPanten sind wieder da!'>Töröö! Die ElePHPanten sind wieder da!</a></li><li><a href='http://www.phpgangsta.de/erinnerung-elephpanten-und-phpstorm-20-rabatt' rel='bookmark' title='Erinnerung: ElePHPanten und PHPStorm Rabatt'>Erinnerung: ElePHPanten und PHPStorm Rabatt</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/elephpanten-zu-weihnachten-und-mayflower-adventskalender/feed</wfw:commentRss> <slash:comments>82</slash:comments> </item> <item><title>PHPStorm 3.0 erschienen!</title><link>http://www.phpgangsta.de/phpstorm-3-0-erschienen</link> <comments>http://www.phpgangsta.de/phpstorm-3-0-erschienen#comments</comments> <pubDate>Tue, 29 Nov 2011 13:43:43 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[IDE]]></category> <category><![CDATA[PHP IDE]]></category> <category><![CDATA[PHPStorm]]></category> <category><![CDATA[PHPStorm 3.0]]></category> <category><![CDATA[release]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4004</guid> <description><![CDATA[Kurze und aktuelle News: PHPStorm 3.0, die meiner Meinung nach beste PHP IDE von JetBrains, ist soeben released worden, alle die eine Lizenz haben können updaten. Wer noch keine Lizenz hat kann PHPStorm 30 Tage kostenlos testen. Ankündigung: http://blog.jetbrains.com/webide/2011/11/phpstorm-3-0-keep-your-code-in-its-best-shape What&#8217;s new: http://www.jetbrains.com/phpstorm/whatsnew/?whatsnew30 Download: http://www.jetbrains.com/phpstorm/download/index.html Ähnliche Artikel: Eilmeldung: PHPStorm satte 50% günstiger! PHPStorm 60% günstiger! Bis [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/eilmeldung-phpstorm-satte-60-gunstiger' rel='bookmark' title='Eilmeldung: PHPStorm satte 50% günstiger!'>Eilmeldung: PHPStorm satte 50% günstiger!</a></li><li><a href='http://www.phpgangsta.de/phpstorm-60-gunstiger-bis-zum-30-04-2011' rel='bookmark' title='PHPStorm 60% günstiger! Bis zum 30.04.2011'>PHPStorm 60% günstiger! Bis zum 30.04.2011</a></li><li><a href='http://www.phpgangsta.de/20-gutschein-fur-phpstorm-verlangert' rel='bookmark' title='20% Gutschein für PHPStorm verlängert!'>20% Gutschein für PHPStorm verlängert!</a></li></ol>]]></description> <content:encoded><![CDATA[<p><img class="alignright size-full wp-image-4025" style="border: 0pt none;" title="phpstorm3.0" src="http://www.phpgangsta.de/wp-content/uploads/phpstorm3.02.png" alt="" width="272" height="202" />Kurze und aktuelle News: <a href="http://www.jetbrains.com/phpstorm/index.html" target="_blank">PHPStorm</a> 3.0, die meiner Meinung nach beste PHP IDE von JetBrains, ist soeben released worden, alle die eine Lizenz haben können updaten. Wer noch keine Lizenz hat kann PHPStorm 30 Tage kostenlos testen.</p><p>Ankündigung:<br /> <a href="http://blog.jetbrains.com/webide/2011/11/phpstorm-3-0-keep-your-code-in-its-best-shape" target="_blank"> http://blog.jetbrains.com/webide/2011/11/phpstorm-3-0-keep-your-code-in-its-best-shape</a></p><p>What&#8217;s new:<br /> <a href="http://www.jetbrains.com/phpstorm/whatsnew/?whatsnew30" target="_blank"> http://www.jetbrains.com/phpstorm/whatsnew/?whatsnew30</a></p><p>Download:<br /> <a href="http://www.jetbrains.com/phpstorm/download/index.html" target="_blank"> http://www.jetbrains.com/phpstorm/download/index.html</a></p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/eilmeldung-phpstorm-satte-60-gunstiger' rel='bookmark' title='Eilmeldung: PHPStorm satte 50% günstiger!'>Eilmeldung: PHPStorm satte 50% günstiger!</a></li><li><a href='http://www.phpgangsta.de/phpstorm-60-gunstiger-bis-zum-30-04-2011' rel='bookmark' title='PHPStorm 60% günstiger! Bis zum 30.04.2011'>PHPStorm 60% günstiger! Bis zum 30.04.2011</a></li><li><a href='http://www.phpgangsta.de/20-gutschein-fur-phpstorm-verlangert' rel='bookmark' title='20% Gutschein für PHPStorm verlängert!'>20% Gutschein für PHPStorm verlängert!</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/phpstorm-3-0-erschienen/feed</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>Linkpool Nummer 26</title><link>http://www.phpgangsta.de/linkpool-nummer-26</link> <comments>http://www.phpgangsta.de/linkpool-nummer-26#comments</comments> <pubDate>Sat, 26 Nov 2011 10:33:11 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[Lesepool]]></category> <category><![CDATA[Linkpool]]></category> <category><![CDATA[Links]]></category> <category><![CDATA[Session]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3928</guid> <description><![CDATA[Der neue Apache httpd v 2.4 (PDF): http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdf In welchen Fällen bei foreach-Schleifen nutzt PHP intern Kopien und wann nicht: http://nikic.github.com/2011/11/11/PHP-Internals-When-does-foreach-copy.html Was bei Google unter anderem wichtig ist: Qualität, Rechtschreibung &#8230; http://sixrevisions.com/content-strategy/creating-websites-optimized-for-googles-panda-algorithm/ PHP Session Storage via MySQL Cluster und Memcached-Frontend: http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html 6 Kostenloses Web-Speed-Tools: http://t3n.de/news/website-speedtest-6-kostenlose-tools-342243/ Wie Facebook seine Releases deployed, monitored usw. http://www.facebook.com/video/video.php?v=10100259101684977&#38;oid=9445547199&#38;comments Warum man [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/linkpool-nummer-23' rel='bookmark' title='Linkpool Nummer 23'>Linkpool Nummer 23</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-21' rel='bookmark' title='Linkpool Nummer 21'>Linkpool Nummer 21</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-20' rel='bookmark' title='Linkpool Nummer 20'>Linkpool Nummer 20</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Der neue Apache httpd v 2.4 (PDF):</p><p><a href="http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdf" target="_blank">http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdf</a></p><p>In welchen Fällen bei foreach-Schleifen nutzt PHP intern Kopien und wann nicht:</p><p><a href="http://nikic.github.com/2011/11/11/PHP-Internals-When-does-foreach-copy.html" target="_blank">http://nikic.github.com/2011/11/11/PHP-Internals-When-does-foreach-copy.html</a></p><p>Was bei Google unter anderem wichtig ist: Qualität, Rechtschreibung &#8230;</p><p><a href="http://sixrevisions.com/content-strategy/creating-websites-optimized-for-googles-panda-algorithm/" target="_blank">http://sixrevisions.com/content-strategy/creating-websites-optimized-for-googles-panda-algorithm/</a></p><p><span id="more-3928"></span>PHP Session Storage via MySQL Cluster und Memcached-Frontend:</p><p><a href="http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html" target="_blank">http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html</a></p><p>6 Kostenloses Web-Speed-Tools:</p><p><a href="http://t3n.de/news/website-speedtest-6-kostenlose-tools-342243/" target="_blank">http://t3n.de/news/website-speedtest-6-kostenlose-tools-342243/</a></p><p>Wie Facebook seine Releases deployed, monitored usw.</p><p><a href="http://www.facebook.com/video/video.php?v=10100259101684977&amp;oid=9445547199&amp;comments" target="_blank">http://www.facebook.com/video/video.php?v=10100259101684977&amp;oid=9445547199&amp;comments</a></p><p>Warum man den Destructor nicht manuell aufrufen sollte:</p><p><a href="http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/" target="_blank">http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/</a></p><p>Auf welche Weise man Selenium 2 nutzen kann:</p><p><a href="http://css.dzone.com/articles/selenium-2-php-code" target="_blank">http://css.dzone.com/articles/selenium-2-php-code</a></p><p>Fallstudie wie 500ms oder 1000ms die Conversion nachhaltig beeinflusst:</p><p><a href="http://www.webperformancetoday.com/2011/11/23/case-study-slow-page-load-mobile-business-metrics/" target="_blank">http://www.webperformancetoday.com/2011/11/23/case-study-slow-page-load-mobile-business-metrics/</a></p><p>PHP Aufgaben mit so wenig Bytes wie möglich lösen:</p><p><a href="http://www.phpgolf.org/" target="_blank">http://www.phpgolf.org/</a></p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/linkpool-nummer-23' rel='bookmark' title='Linkpool Nummer 23'>Linkpool Nummer 23</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-21' rel='bookmark' title='Linkpool Nummer 21'>Linkpool Nummer 21</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-20' rel='bookmark' title='Linkpool Nummer 20'>Linkpool Nummer 20</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/linkpool-nummer-26/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Slides und Videos der Velocity Europe 2011</title><link>http://www.phpgangsta.de/slides-und-videos-der-velocity-europe-2011</link> <comments>http://www.phpgangsta.de/slides-und-videos-der-velocity-europe-2011#comments</comments> <pubDate>Fri, 25 Nov 2011 09:43:19 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Javascript]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[Conference]]></category> <category><![CDATA[Konferenz]]></category> <category><![CDATA[Präsentationen]]></category> <category><![CDATA[Slides]]></category> <category><![CDATA[Velocity]]></category> <category><![CDATA[VelocityEU]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3956</guid> <description><![CDATA[Hier werdet ihr euch freuen, es gibt viele Videos und viele Präsentationen von der Velocity Europe, sehr gute Speaker und sehr interessante Themen aus dem Performance- und Operations Umfeld, dafür sollte man sich auf jeden Fall einige Stunden einplanen und Videos + Präsentationen angucken, es lohnt! Dienstag, 08. November 2011 9:00 Plenary Opening remarks Steve [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/velocity-europe-tag-1-der-vormittag' rel='bookmark' title='Velocity Europe Tag 1: Der Vormittag'>Velocity Europe Tag 1: Der Vormittag</a></li><li><a href='http://www.phpgangsta.de/velocity-europe-tag-2-whao' rel='bookmark' title='Velocity Europe Tag 2: Whao!'>Velocity Europe Tag 2: Whao!</a></li><li><a href='http://www.phpgangsta.de/velocity-europe-tag-1-die-sessions-am-nachmittag' rel='bookmark' title='Velocity Europe Tag 1: Die Sessions am Nachmittag'>Velocity Europe Tag 1: Die Sessions am Nachmittag</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Hier werdet ihr euch freuen, es gibt viele Videos und viele Präsentationen von der <a href="http://velocityconf.com/velocityeu/" target="_blank">Velocity Europe</a>, sehr gute Speaker und sehr interessante Themen aus dem Performance- und Operations Umfeld, dafür sollte man sich auf jeden Fall einige Stunden einplanen und Videos + Präsentationen angucken, es lohnt!</p><p><strong>Dienstag, 08. November 2011</strong></p><p>9:00 Plenary<br /> Opening remarks Steve Souders (Google), John Allspaw (Etsy.com)</p><p>9:10 Plenary<br /> <a href="http://assets.en.oreilly.com/1/event/74/A%20Career%20in%20Web%20Operations%20Presentation.pdf" target="_blank">A Career in Web Operations</a> Theo Schlossnagle (OmniTI)<br /> <a href="http://www.youtube.com/watch?v=LAP1zaXUvAE" target="_blank">YouTube Video</a></p><p>9:40 Plenary<br /> Lightning Demos<br /> <a href="http://pagespeed-velocity-europe2011.appspot.com/#1" target="_blank"> Advanced Performance Analysis with Google Page Speed</a> Andrew Oates (Google)<br /> <a href="http://assets.en.oreilly.com/1/event/74/Lightning%20Demos%20Tuesday%20Presentation.pdf" target="_blank">Debugging Mobile Web Applications with weinre</a> Patrick Mueller (IBM)<br /> <a href="http://www.youtube.com/watch?v=UxgMS19S134" target="_blank">YouTube Video</a><br /> <a href="http://www.youtube.com/watch?v=O13c46WSJ-E" target="_blank">YouTube Video</a></p><p>9:55 Plenary<br /> <a href="http://assets.en.oreilly.com/1/event/74/If%20You%20Can%20Keep%20Your%20Site%20Standing%20Up%20When%20All%20About%20You%20Are%20Falling%20Down%E2%80%A6%20Presentation.pdf" target="_blank">If You Can Keep Your Site Standing Up When All About You Are Falling Down…</a> Robert Castley (Keynote Systems)<br /> <a href="http://www.youtube.com/watch?v=Tyqg-WyR94M" target="_blank">YouTube Video</a></p><p><span id="more-3956"></span>10:00 Plenary<br /> <a href="http://www.slideshare.net/AloisReitbauer/what-it-means-to-deliver-exceptional-performance" target="_blank">What It Means To Deliver Exceptional Performance</a> Alois Reitbauer (dynatrace Software)<br /> <a href="http://www.youtube.com/watch?v=6kuVwi_3doE" target="_blank">YouTube Video</a></p><p>10:05 Plenary<br /> <a href="http://assets.en.oreilly.com/1/event/74/The%20Future%20of%20Application%20Performance%20Management%20Presentation.pdf" target="_blank">The Future of Application Performance Management</a> Brian Doll (New Relic)<br /> <a href="http://www.youtube.com/watch?v=Suu33DKp3qc" target="_blank">YouTube Video</a></p><p>10:35 Plenary<br /> <a href="http://www.slideshare.net/Strangeloopnet/velocity-eu-the-relationship-between-faster-mobile-sites-and-business-kpis-case-studies-from-the-mobile-frontier" target="_blank">The Relationship Between Faster Mobile Sites and Business KPIs: Case Studies from the Mobile Frontier</a> Joshua Bixby (Strangeloop Networks)<br /> <a href="http://www.youtube.com/watch?v=6fKHA50307I" target="_blank">YouTube Video</a></p><p>11:05 Plenary<br /> <a href="http://assets.en.oreilly.com/1/event/74/The%20Velocity%20of%20Dev%20Ops%20Presentation.pdf" target="_blank">The Velocity of Dev Ops</a> Jon Jenkins (Amazon.com)<br /> <a href="http://www.youtube.com/watch?v=R6_SPs0JGbQ" target="_blank">YouTube Video</a></p><p>11:20 Plenary<br /> <a href="http://assets.en.oreilly.com/1/event/74/Betfair_s%20Site%20Rebuild_%20Fast%20-%20We%20Promise%20Presentation.pdf" target="_blank">Betfair&#8217;s Site Rebuild: Fast &#8211; We Promise</a> Tim Morrow (Betfair)<br /> <a href="http://www.youtube.com/watch?v=sV4_RqYM4Kw" target="_blank">YouTube Video</a></p><p>13:00<br /> <a href="http://assets.en.oreilly.com/1/event/74/Monitoring%20Is%20Easy,%20Why%20Are%20We%20So%20Bad%20At%20It_%20Presentation.pdf" target="_blank">Monitoring Is Easy, Why Are We So Bad At It?</a> Theo Schlossnagle (OmniTI)<br /> <a href="http://assets.en.oreilly.com/1/event/74/Introducing%20the%20Amazon%20Silk%20Web%20Browser%20Presentation.pdf" target="_blank">Introducing the Amazon Silk Web Browser</a> Jon Jenkins (Amazon.com)</p><p>13:50<br /> <a href="http://assets.en.oreilly.com/1/event/74/Massively%20Sharded%20MySQL%20at%20Tumblr%20Presentation.pdf" target="_blank">Massively Sharded MySQL at Tumblr</a> Evan Elias (Tumblr)<br /> <a href="http://assets.en.oreilly.com/1/event/74/Know%20Your%20Engines_%20How%20to%20Make%20Your%20JavaScript%20Fast%20Presentation%202.pdf" target="_blank">Know Your Engines: How to Make Your JavaScript Fast</a> David Mandelin (Mozilla Corporation)</p><p>14:40<br /> <a href="http://assets.en.oreilly.com/1/event/74/Quality%20of%20Service%20_QoS_%20for%20Web%20Applications%20Presentation.pdf" target="_blank">Quality of Service (QoS) for Web Applications</a> William Louth (JINSPIRED BV)<br /> <a href="http://www.slideshare.net/sthair/measuring-web-performance-velocity-eu-2011" target="_blank">Measuring Web Performance</a> Stephen Thair (Seriti Consulting)</p><p>15:55<br /> <a href="http://assets.en.oreilly.com/1/event/74/Our%20First%20DDoS%20attack%20Presentation.pdf" target="_blank">Our First DDoS attack</a> Cosimo Streppone (Opera Software ASA)<br /> <a href="http://assets.en.oreilly.com/1/event/74/How%20DRY%20Affects%20JavaScript%20Performance%20%E2%80%94%20Faster%20JavaScript%20Execution%20For%20The%20Lazy%20Developer%20Presentation.pdf" target="_blank">How DRY Affects JavaScript Performance — Faster JavaScript Execution For The Lazy Developer</a> Mathias Bynens (Qiwi)</p><p>16:20 Empirical Results from Page Speed and mod_pagespeed Matthew Steele (Google), Andrew Oates (Google), Joshua Marantz (Google)</p><p>16:45<br /> <a href="http://assets.en.oreilly.com/1/event/74/Be%20Fast%20Or%20Stay%20Behind%20-%20Building%20A%20Continuous%20Delivery%20Platform%20Presentation.pdf" target="_blank">Be Fast Or Stay Behind &#8211; Building A Continuous Delivery Platform</a> Schlomo Schapiro (ImmobilienScout24), Ingmar Krusch (ImmobilienScout24)<br /> <a href="http://www.slideshare.net/MeasureWorks/measureworks-velocity-conference-europe-performance-automation-101" target="_blank">Performance Automation 101</a> Jeroen Tjepkema (MeasureWorks)</p><p><strong>Mittwoch, 09. November 2011</strong></p><p>9:00 Plenary<br /> Opening remarks John Allspaw (Etsy.com), Steve Souders (Google)</p><p>9:10 Plenary<br /> Designing for Disaster: How Teams Can Thrive in the Cloud Jeff Veen (Typekit)<br /> <a href="http://www.youtube.com/watch?v=v2UwvN6zusg" target="_blank">YouTube Video</a></p><p>9:40 Plenary<br /> Lightning Demos<br /> <a href="http://assets.en.oreilly.com/1/event/74/Lightning%20Demos%20Wednesday%20Presentation%202.pdf" target="_blank">Deep Dive Browser Diagnostics</a> Andreas Grabner (dynaTrace Software)<br /> <a href="http://assets.en.oreilly.com/1/event/74/Lightning%20Demos%20Wednesday%20Presentation%201.pdf" target="_blank">FITB &#8211; Network Graphing Done Right</a> Laurie Denness (Etsy)<br /> <a href="http://www.youtube.com/watch?v=yUIYe0-siGo" target="_blank">YouTube Video</a><br /> <a href="http://www.youtube.com/watch?v=g23qrdpMOXs" target="_blank">YouTube Video</a></p><p>9:55 Plenary<br /> <a href="http://assets.en.oreilly.com/1/event/74/Exhaustive%20End-User%20Monitoring_%20A%20Necessity%20in%20an%20Ever%20Complex%20Digital%20Environment%20Presentation.pdf" target="_blank">Exhaustive End-User Monitoring: A Necessity in an Ever Complex Digital Environment</a> Arnaud Becart (ip-label)<br /> <a href="http://www.youtube.com/watch?v=TFAb3nOB2k0" target="_blank">YouTube Video</a></p><p>10:35 Plenary<br /> <a href="http://assets.en.oreilly.com/1/event/74/Anticipation_%20What%20Could%20Possibly%20Go%20Wrong_%20Presentation.pdf" target="_blank">Anticipation: What Could Possibly Go Wrong?</a> John Allspaw (Etsy.com)<br /> <a href="http://www.youtube.com/watch?v=gy2lTFD4560" target="_blank">YouTube Video</a></p><p>11:05 Plenary<br /> Full Stack Awareness Artur Bergman (Wikia/Fastly)<br /> <a href="http://www.youtube.com/watch?v=oebqlzblfyo" target="_blank">YouTube Video</a></p><p>11:20 Plenary<br /> Taking on the Performance Challenge Ivo Teel (SPIL GAMES), Laurens van Hees (SPIL GAMES)<br /> <a href="http://www.youtube.com/watch?v=kHYEsIp-hxo" target="_blank">YouTube Video</a></p><p>13:00<br /> NoSQL Performance In The Real World David Mytton (Boxed Ice)<br /> <a href="http://www.slideshare.net/andreasbovens/fast-furious-speed-in-the-opera-browser" target="_blank">Fast &amp; Furious: Speed In The Opera Browser</a> Andreas Bovens (Opera Software)</p><p>13:30<br /> Chrome Fast Tony Gentilcore (Google)</p><p>13:50<br /> <a href="http://assets.en.oreilly.com/1/event/74/Apps%20Behaving%20Badly%20Presentation.pdf" target="_blank">Apps Behaving Badly</a> Michael Brunton-Spall (Guardian News and Media), Lisa van Gelder (Guardian News and Media)</p><p>14:00<br /> <a href="http://icant.co.uk/talks/velocity2011/#1" target="_blank">Firefox Performance</a> Chris Heilmann (Mozilla Firefox)</p><p>14:40<br /> <a href="http://assets.en.oreilly.com/1/event/74/Deploying%20Large%20Payloads%20At%20Scale%20Presentation.pdf" target="_blank">Deploying Large Payloads At Scale</a> Ramon van Alteren (Hyves)<br /> Fast Loading JavaScript Aaron Peters (aaronpeters.nl)</p><p>15:55<br /> The Social Seismograph &#8211; I Just Love Monitoring Johannes Mainusch (XING AG)<br /> Mobile UI Performance Estelle Weyl (Standardista.com)</p><p>16:45<br /> HTTP Connection Management, From 10 Users To 100 million Bradley Heilbrun (YouTube/Google Inc)<br /> Player Widgets Panel Matas Petrikas (SoundCloud), Andrew Pile (Vimeo), Greg Schechter (YouTube)</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/velocity-europe-tag-1-der-vormittag' rel='bookmark' title='Velocity Europe Tag 1: Der Vormittag'>Velocity Europe Tag 1: Der Vormittag</a></li><li><a href='http://www.phpgangsta.de/velocity-europe-tag-2-whao' rel='bookmark' title='Velocity Europe Tag 2: Whao!'>Velocity Europe Tag 2: Whao!</a></li><li><a href='http://www.phpgangsta.de/velocity-europe-tag-1-die-sessions-am-nachmittag' rel='bookmark' title='Velocity Europe Tag 1: Die Sessions am Nachmittag'>Velocity Europe Tag 1: Die Sessions am Nachmittag</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/slides-und-videos-der-velocity-europe-2011/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP</title><link>http://www.phpgangsta.de/wo-ungefahr-ist-eine-ip-adresse-beheimatet-geoip-in-php</link> <comments>http://www.phpgangsta.de/wo-ungefahr-ist-eine-ip-adresse-beheimatet-geoip-in-php#comments</comments> <pubDate>Wed, 23 Nov 2011 09:11:20 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[Geo IP]]></category> <category><![CDATA[GeoIP]]></category> <category><![CDATA[Geolocation]]></category> <category><![CDATA[MaxMind]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3980</guid> <description><![CDATA[Manchmal möchte man wissen aus welchem Land oder welcher Region eine IP-Adresse kommt, und dafür gibt es bereits Lösungen die leicht zu benutzen sind. Als erstes schauen wir uns die Geo-IP-Datenbank von MaxMind an, die wir mit der PEAR-Klasse Net_GeoIP ansprechen. Wer nur das Land braucht der sollte sich die kostenlose GeoLite Country Datenbank anschauen, [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/mit-php-eine-ebay-auktion-starten' rel='bookmark' title='Mit PHP eine eBay-Auktion starten'>Mit PHP eine eBay-Auktion starten</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Manchmal möchte man wissen aus welchem Land oder welcher Region eine IP-Adresse kommt, und dafür gibt es bereits Lösungen die leicht zu benutzen sind. Als erstes schauen wir uns die Geo-IP-Datenbank von <a href="http://www.maxmind.com/" target="_blank">MaxMind</a> an, die wir mit der PEAR-Klasse <a href="http://pear.php.net/manual/en/package.networking.net-geoip.php" target="_blank">Net_GeoIP</a> ansprechen. Wer nur das Land braucht der sollte sich die kostenlose <a href="http://www.maxmind.com/app/geolitecountry" target="_blank">GeoLite Country</a> Datenbank anschauen, wenn die Stadt bzw. die Region benötigt wird wirft man einen Blick auf die <a href="http://www.maxmind.com/app/geolitecity" target="_blank">GeoLite City</a> Datenbank. Von beiden gibt es auch noch <a href="http://www.maxmind.com/app/products" target="_blank">kostenpflichtige Versionen</a>, die genauer und aktueller sind.</p><p>Das erste Beispiel zeigt die Verwendung der Länder-Datenbank:</p><p><span id="more-3980"></span></p><pre class="brush: php; title: ; notranslate">&lt;?php
require_once &quot;Net/GeoIP.php&quot;;

$geoip = Net_GeoIP::getInstance(&quot;GeoIP.dat&quot;);

$ipAddresses = array(
    '77.177.166.7',
    '41.135.69.4',
    '183.111.12.21',
    '202.127.1.88',
    '174.139.204.218',
    '192.121.32.239',
);
foreach ($ipAddresses as $ipAddress) {
    echo $ipAddress.' '.$geoip-&gt;lookupCountryCode($ipAddress).&quot;\n&quot;;
}</pre><p>Die Ausgabe in diesem Fall sieht so aus:</p><pre class="brush: plain; title: ; notranslate">77.177.166.7 DE
41.135.69.4 ZA
183.111.12.21 KR
202.127.1.88 CN
174.139.204.218 US
192.121.32.239 SE</pre><p>Für die zweite Variante mit der City-Datenbank sieht das Script recht ähnlich aus:</p><pre class="brush: php; title: ; notranslate">&lt;?php
require_once &quot;Net/GeoIP.php&quot;;

$geoip = Net_GeoIP::getInstance(&quot;GeoLiteCity.dat&quot;);

$ipAddresses = array(
    '77.177.166.7',
    '41.135.69.4',
    '183.111.12.21',
    '202.127.1.88',
    '174.139.204.218',
    '192.121.32.239',
);
foreach ($ipAddresses as $ipAddress) {
    $location = $geoip-&gt;lookupLocation($ipAddress);

    echo 'IP Address: '.$ipAddress.&quot;\n&quot;.
        'CountryCode: '.$location-&gt;countryCode.&quot;\n&quot;.
        'CountryName: '.$location-&gt;countryName.&quot;\n&quot;.
        'City: '.$location-&gt;city.&quot;\n&quot;.
        'PostalCode: '.$location-&gt;postalCode.&quot;\n&quot;.
        'Region: '. $location-&gt;region.&quot;\n&quot;.
        'Lat/Lan: '.$location-&gt;latitude.&quot;/&quot;.$location-&gt;longitude.&quot;\n\n&quot;;
}</pre><p>Die Ausgabe:</p><pre class="brush: plain; title: ; notranslate">IP Address: 77.177.166.7
CountryCode: DE
CountryName: Germany
City: Spenge
PostalCode:
Region: 07
Lat/Lan: 52.1333/8.4833

IP Address: 41.135.69.4
CountryCode: ZA
CountryName: South Africa
City: Port Elizabeth
PostalCode:
Region: 05
Lat/Lan: -33.9667/25.5833

IP Address: 183.111.12.21
CountryCode: KR
CountryName: Korea, Republic of
City: Seoul
PostalCode:
Region: 11
Lat/Lan: 37.5664/126.9997

IP Address: 202.127.1.88
CountryCode: CN
CountryName: China
City: Beijing
PostalCode:
Region: 22
Lat/Lan: 39.9289/116.3883

IP Address: 174.139.204.218
CountryCode: US
CountryName: United States
City: Spartanburg
PostalCode: 29302
Region: SC
Lat/Lan: 34.8822/-81.8511

IP Address: 192.121.32.239
CountryCode: SE
CountryName: Sweden
City:
PostalCode:
Region:
Lat/Lan: 62/15</pre><p>Des weiteren gibt es noch eine Region-Datenbank und eine Organisation/ISP-Datenbank, die mit den entsprechenden Methoden <a href="http://pear.php.net/manual/en/package.networking.net-geoip.lookupregion.php" target="_blank">lookupRegion()</a> und <a href="http://pear.php.net/manual/en/package.networking.net-geoip.lookuporg.php" target="_blank">lookupOrg()</a> in Net_GeoIP ausgelesen werden können.</p><p>Alternativ gibt es die Möglichkeit die <a href="http://pecl.php.net/package/geoip" target="_blank">PECL geoip PHP Extension</a> zu nutzen, die auch die Datenbanken von MaxMind nutzt, das <a href="http://www.php.net/manual/en/book.geoip.php" target="_blank">Manual befindet sich auf php.net</a>.</p><p>Webserver können auch Geo-Informationen nutzen, beispielsweise <a href="http://www.maxmind.com/app/mod_geoip" target="_blank">Apache GeoIP API</a> und <a href="http://wiki.nginx.org/HttpGeoIPModule" target="_blank">nginx HttpGeoIP Module</a>. Damit ist es super einfach Zugriffe aus bestimmten Ländern zu blocken oder anderen Inhalt zu präsentieren, oder auch die Geo-Information als Parameter an den Backend-Server zu liefern (im Fall von nginx als <a href="http://www.phpgangsta.de/tag/reverse-proxy" target="_blank">Reverse Proxy</a>).</p><p>Es gibt auch einige Webservices die Geo-Informationen zu IP-Adressen bieten, von denen bekommt man via REST entweder JSON, XML oder CSV. Einige Beispiele:</p><p><a href="http://freegeoip.net" target="_blank">http://freegeoip.net</a></p><p><a href="http://www.geobytes.com/iplocator.htm" target="_blank">http://www.geobytes.com/iplocator.htm</a></p><p><a href="http://www.geoio.com/" target="_blank">http://www.geoio.com/</a></p><p><a href="http://ipinfodb.com/ip_location_api_json.php" target="_blank">http://ipinfodb.com/ip_location_api_json.php</a></p><p><a href="https://simplegeo.com/docs/clients-code-libraries/php" target="_blank">https://simplegeo.com/docs/clients-code-libraries/php</a></p><p><a href="http://www.hostip.info/use.html" target="_blank">http://www.hostip.info/use.html</a></p><p>Wenn diese Dienste eine bessere Datenbank bieten lohnt sich evtl. ein Blick, aber da man auf die Verfügbarkeit angewiesen ist und Webservices auch langsamer sind als lokale Lookups ist die Verwendung problematisch.</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/mit-php-eine-ebay-auktion-starten' rel='bookmark' title='Mit PHP eine eBay-Auktion starten'>Mit PHP eine eBay-Auktion starten</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/wo-ungefahr-ist-eine-ip-adresse-beheimatet-geoip-in-php/feed</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Slides der ZendCon 2011</title><link>http://www.phpgangsta.de/slides-der-zendcon-2011</link> <comments>http://www.phpgangsta.de/slides-der-zendcon-2011#comments</comments> <pubDate>Wed, 16 Nov 2011 10:52:00 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Conference]]></category> <category><![CDATA[Konferenz]]></category> <category><![CDATA[Präsentationen]]></category> <category><![CDATA[Slides]]></category> <category><![CDATA[ZendCon]]></category> <category><![CDATA[ZendCon11]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3925</guid> <description><![CDATA[Die PHP Konferenz der Firma Zend, die ZendCon 2011 in Santa Clara, war natürlich wieder ein Highlight was die aktuellen und zukünftigen Themen rund um PHP angeht. Leider sind noch einige Lücken geblieben, wenn ihr die fehlenden Präsentationen findet, bitte in die Kommentare packen, Danke! Montag, 17.10.2011 Creating and Using Streams, Filters and Sockets Elizabeth [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/slides-der-zendcon-2010' rel='bookmark' title='Slides der ZendCon 2010'>Slides der ZendCon 2010</a></li><li><a href='http://www.phpgangsta.de/slides-der-phpbenelux-conference-2011' rel='bookmark' title='Slides der PHPBenelux Conference 2011'>Slides der PHPBenelux Conference 2011</a></li><li><a href='http://www.phpgangsta.de/slides-vom-phpday-2011' rel='bookmark' title='Slides vom phpDay 2011'>Slides vom phpDay 2011</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Die PHP Konferenz der Firma Zend, die <a href="http://zendcon.com/" target="_blank">ZendCon 2011</a> in Santa Clara, war natürlich wieder ein Highlight was die aktuellen und zukünftigen Themen rund um PHP angeht. Leider sind noch einige Lücken geblieben, wenn ihr die fehlenden Präsentationen findet, bitte in die Kommentare packen, Danke!</p><p><strong>Montag, 17.10.2011</strong></p><p><a href="http://elizabethmariesmith.com/slides/zendcon2011/Writing%20and%20Using%20PHP%20Streams%20and%20Sockets%20-%20Zendcon%202011.pdf" target="_blank">Creating and Using Streams, Filters and Sockets</a><br /> Elizabeth Marie Smith</p><p>Doctrine 2<br /> Juozas Kaziukėnas</p><p>PHP Components From Idea To Maturity<br /> Chris Hartjes</p><p><a href="http://derickrethans.nl/talks/phpexts-zendcon11.pdf" target="_blank">PHP Extensions, Why and What?</a><br /> Derick Rethans</p><p>Zend PHP 5.3 Certification Boot Camp<br /> Christian Wenz</p><p><span id="more-3925"></span>Beware of the Dark Side, Luke!<br /> Arne Blankerts</p><p>Design Patterns in Action<br /> Stefan Priebsch</p><p><a href="http://www.slideshare.net/bradley.holt/zendcon-2011-learning-couchdb" target="_blank">Learning CouchDB</a><br /> Bradley Holt</p><p><strong>Dienstag, 18.10.2011</strong></p><p>Opening Keynote<br /> Andi Gutmans<br /> <a href="http://www.youtube.com/watch?v=khxdlGE0ZGM" target="_blank">Video</a></p><p><a href="http://www.slideshare.net/pmjones88/benchmarking-applications-and-frameworks-9759357" target="_blank">Benchmarking Applications and Frameworks</a><br /> Paul M. Jones</p><p><a href="http://spoutserver.com/talks/websockets.html" target="_blank">HTML5 WebSockets</a><br /> Scott Mattocks</p><p><a href="http://www.slideshare.net/aseiden/php-batch-jobs-on-ibm-i" target="_blank">PHP Batch Jobs on IBM i</a><br /> Alan Seiden</p><p>Development in the 24th and a half century<br /> Kevin Schroeder</p><p><a href="http://gowat.ch/g4suzc11" target="_blank">Git for Subversion Users</a><br /> Stefan Koopmanschap</p><p>Cloud Based Application Performance Testing<br /> Moris Chen</p><p>Overview of Zend Framework 2<br /> Matthew Weier O&#8217;Phinney</p><p>PHP and IBM i Frequent Questions, FastCGI, DB2, etc.<br /> Tony Cairns</p><p><a href="http://derickrethans.nl/talks/xdebug-zendcon11.pdf" target="_blank">Xdebug</a><br /> Derick Rethans</p><p>Change is Inevitable (Except from a Vending Machine)<br /> Stefan Priebsch</p><p><a href="http://derickrethans.nl/talks/profiling-zendcon11.pdf" target="_blank">Profiling PHP Applications</a><br /> Derick Rethans</p><p><a href="http://www.slideshare.net/jimbojsb/scaling-php-applications-with-redis" target="_blank">Scaling PHP Applications with Redis</a><br /> Josh Butts</p><p><a href="http://www.slideshare.net/billkarwin/sql-injection-myths-and-fallacies" target="_blank">SQL Injection Myths and Fallacies</a><br /> Bill Karwin</p><p>The Future of PHP on IBM i<br /> Tim Rowe</p><p><a href="http://gowat.ch/aplas2zc" target="_blank">A Practical Look At Symfony2</a><br /> Stefan Koopmanschap</p><p><a href="http://emsmith.net/slides/zendcon2011/Event%20and%20Signal%20Driven%20Programming%20Techniques.pdf" target="_blank">Event and Signal Driven Programming Techniques</a><br /> Elizabeth Marie Smith</p><p>Open Source PHP Toolkit for IBM i<br /> Mike Pavlak, Tony Cairns</p><p>Skynet in ZF 2.0: The Automation, Compilation, and Generation of Projects with Zend\Code<br /> Ralph Schindler</p><p><a href="http://www.slideshare.net/aseiden/db2-and-php-best-practices-on-ibm-i" target="_blank">DB2 and PHP Best Practices on IBM i</a><br /> Alan Seiden</p><p>Deployment Without the Chaos<br /> Eric Ritchie</p><p>Manage Cloud Infrastructures Using Zend Framework<br /> Enrico Zimuel</p><p><a href="http://ilia.ws/files/zendcon_2011_under_the_hood.pdf" target="_blank">Under the Hood</a><br /> Ilia Alshanetsky</p><p>Zend Studio Tips and Tricks<br /> Roy Ganor</p><p><strong>Mittwoch, 19.10.2011</strong></p><p>Dependency Injection; Containers and Frameworks In PHP<br /> Ralph Schindler</p><p>Introduction to Adobe Flash Builder for PHP<br /> Roy Ganor</p><p>MySQL &#8212; What&#8217;s New<br /> Dave Stokes</p><p>Production Scaling in the Cloud<br /> Kent Mitchell</p><p><a href="http://www.slideshare.net/Wombert/largescale-data-processing-with-hadoop-and-php-zendcon-2011-20111019" target="_blank">Large-Scale Data Processing with Hadoop and PHP</a><br /> David Zülke</p><p><a href="http://www.slideshare.net/afilina/zendcon-2011introtoflex" target="_blank">Intro to Flex</a><br /> Anna Filina</p><p><a href="http://www.slideshare.net/mwillbanks/soa-with-zend-framework" target="_blank">SOA with Zend Framework</a><br /> Mike Willbanks</p><p><a href="http://www.slideshare.net/jcarouth/the-contextual-experience-of-the-mobile-web" target="_blank">The Contextual Experience of the Mobile Web</a><br /> Jeff Carouth</p><p>Triggered: Zend Framework 2&#8242;s EventManager<br /> Matthew Weier O&#8217;Phinney</p><p>Extending Open Source Solutions for Large Scale Federal Applications<br /> Rakesh Kumar</p><p>API Security<br /> Rob Richards</p><p><a href="http://www.slideshare.net/SamHennessy/adding-dependency-injection-to-legacy-applications" target="_blank">Adding Dependency Injection To Legacy Applications</a><br /> Sam Hennessy</p><p><a href="http://www.slideshare.net/mkherlakian/big-serveriswatchingyou" target="_blank">Big Server is Watching You</a><br /> Maurice Kherlakian</p><p>Character Sets Suck<br /> Raymond DeRoo</p><p>Couchbase Mobile, The database that talks sync.<br /> Matt Ingenthron</p><p><a href="http://shawnstratton.info/slides/zendcon/" target="_blank">Optimizing Zend Framework for use on High Traffic Volume Web Sites</a><br /> Shawn Stratton</p><p>Cryptography in PHP: Use Cases<br /> Enrico Zimuel</p><p><a href="http://www.slideshare.net/eljefe/jquery-mobile-for-fun-and-profit" target="_blank">jQuery Mobile: For Fun and Profit</a><br /> Daniel Cousineau</p><p>Injecting Domain Expertise into Varchars<br /> Jeff Kibler</p><p><a href="http://emsmith.net/slides/zendcon2011/Using%20SPL%20Tools%20in%20Your%20Code.pdf" target="_blank">Using SPL Tools in Your Code.</a><br /> Elizabeth Marie Smith</p><p>Cloudify Your Application<br /> Ed Kietlinksi</p><p>Performing Security Audits<br /> Arne Blankerts</p><p><a href="http://www.slideshare.net/spf13/mongodb-and-php-zendcon-2011" target="_blank">PHP &amp; MongoDB</a><br /> Steve Francia</p><p><a href="http://www.slideshare.net/sebastian_bergmann/php-testers-toolbox-zend-con-2011" target="_blank">PHP Testing Tools</a><br /> Sebastian Bergmann</p><p><strong>Donnerstag, 20.10.2011</strong></p><p>Introducing Assetic: Asset Management for PHP 5.3<br /> Kris Wallsmith</p><p>Optimizing Application Performance<br /> Kevin Schroeder</p><p><a href="http://www.slideshare.net/jaytaph/puppet-for-dummies-zendcon-2011-edition" target="_blank">Puppet for Dummies</a><br /> Joshua Thijssen</p><p>Unit Testing Zend Framework Apps<br /> Michelangelo van Dam</p><p>Care and feeding of a MySQL Database<br /> Dave Stokes</p><p><a href="http://www.slideshare.net/afilina/javascript-tools-and-framework-faves-zendcon-2011" target="_blank">Javascript Tools and Frameworks Faves</a><br /> Anna Filina</p><p>Mobile Development with Adobe AIR, Flash Builder, and Flex<br /> Mihai Corlan</p><p><a href="http://www.slideshare.net/becoded/powering-your-website-with-realtime-data" target="_blank">Powering Your Website with Realtime Data</a><br /> Bert Van Hauwaert</p><p>Taming the Cloud<br /> Rob Richards</p><p>Implementing the Open/Closed Principle<br /> Sam Hennessy</p><p><a href="http://www.slideshare.net/Wombert/designing-http-interfaces-and-restful-web-services-zendcon-2011-20111020" target="_blank">Designing HTTP Interfaces and RESTful Web Services</a><br /> David Zülke</p><p><a href="http://www.slideshare.net/mwillbanks/mobile-push-notifications" target="_blank">Mobile: Push for Sync and Notifications</a><br /> Mike Willbanks</p><p><a href="http://www.slideshare.net/billkarwin/mysql-55-guide-to-innodb-status" target="_blank">MySQL 5.5 InnoDB Tuning</a><br /> Bill Karwin</p><p>Using GitHub<br /> Scott Chacon</p><p>&#8212;&#8212; weitere Fundstücke &#8212;&#8212;</p><p>Cloud Panel &#8211; Challenges and Tips for Developing Applications in the Cloud<br /> <a href="http://www.youtube.com/watch?v=rH-tL2qi7lE" target="_blank">Video</a></p><p>UnConf: <a href="http://www.slideshare.net/bradley.holt/zendcon-2011-uncon-domain-driven-design" target="_blank">Domain-Driven Design &#8211; A Collaboration Between Domain Experts and Software Practitioners</a></p><p><a href="http://livestre.am/15we3" target="_blank">Jeff Barr &#8211; Amazon Web Services</a></p><p><a href="http://livestre.am/15we1" target="_blank">Automating ebay&#8217;s Infrastrcture</a><br /> Hugh E. Williams</p><p><a href="http://livestre.am/15we2" target="_blank">Zend Framework 2</a><br /> Matthew Weier O&#8217;Phinney</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/slides-der-zendcon-2010' rel='bookmark' title='Slides der ZendCon 2010'>Slides der ZendCon 2010</a></li><li><a href='http://www.phpgangsta.de/slides-der-phpbenelux-conference-2011' rel='bookmark' title='Slides der PHPBenelux Conference 2011'>Slides der PHPBenelux Conference 2011</a></li><li><a href='http://www.phpgangsta.de/slides-vom-phpday-2011' rel='bookmark' title='Slides vom phpDay 2011'>Slides vom phpDay 2011</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/slides-der-zendcon-2011/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>PHP Clouds und Platform as a Service (PaaS): phpcloud von Zend</title><link>http://www.phpgangsta.de/php-clouds-und-platform-as-a-service-paas-phpcloud-von-zend</link> <comments>http://www.phpgangsta.de/php-clouds-und-platform-as-a-service-paas-phpcloud-von-zend#comments</comments> <pubDate>Mon, 14 Nov 2011 08:25:04 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[Cloud]]></category> <category><![CDATA[Container]]></category> <category><![CDATA[PaaS]]></category> <category><![CDATA[phpcloud]]></category> <category><![CDATA[Zend Cloud]]></category> <category><![CDATA[Zend Server]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3888</guid> <description><![CDATA[Die Zend Cloud phpcloud wurde auf der ZendCon 2011 im Oktober vorgestellt, ich habe mich natürlich direkt vorregistriert und seitdem auf einen Invite gewartet. Nun habe ich einen Invite-Key bekommen und direkt ein wenig damit experimentiert. Dieser Artikel stellt also eine weitere Platform-as-a-Service (PaaS) für PHP vor. Die Applikationen laufen auf einem Fundament namens Zend [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/php-clouds-und-platform-as-a-service-paas-ubersicht' rel='bookmark' title='PHP Clouds und Platform as a Service (PaaS): Übersicht'>PHP Clouds und Platform as a Service (PaaS): Übersicht</a></li><li><a href='http://www.phpgangsta.de/php-clouds-und-platform-as-a-service-paas-cloudcontrol' rel='bookmark' title='PHP Clouds und Platform as a Service (PaaS): cloudControl'>PHP Clouds und Platform as a Service (PaaS): cloudControl</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Die <a href="http://www.phpcloud.com/" target="_blank">Zend Cloud phpcloud</a> wurde auf der <a href="http://zendcon.com/" target="_blank">ZendCon 2011</a> im Oktober vorgestellt, ich habe mich natürlich direkt vorregistriert und seitdem auf einen Invite gewartet. Nun habe ich einen Invite-Key bekommen und direkt ein wenig damit experimentiert.</p><p><img class="size-full wp-image-3946 alignright" style="border: 0pt none;" title="Develop-page-for-phpcloud-diagram-627x383px" src="http://www.phpgangsta.de/wp-content/uploads/Develop-page-for-phpcloud-diagram-627x383px.png" alt="" width="439" height="268" />Dieser Artikel stellt also eine weitere <a href="http://www.phpgangsta.de/tag/paas" target="_blank">Platform-as-a-Service (PaaS)</a> für PHP vor. Die Applikationen laufen auf einem Fundament namens <a href="http://www.eschrade.com/page/what-is-phpcloud-com/" target="_blank">Zend Application Fabric</a> (ein aufgebohrter Zend Server) und können entweder in einer private Cloud oder bei einem der folgenden Anbieter gehostet werden: Rightscale, Amazon, IBM oder Rackspace (<a href="http://www.phpcloud.com/deploy" target="_blank">Info</a>).</p><p>Die <a href="https://my.phpcloud.com/user/login" target="_blank">Registrierung</a> verlangt aktuell einen Zend-Account und den besagten Invite-Key. Danach muss man als nächstes einen Container anlegen in dem die Applikationen laufen werden. Ich lege also einen ersten Testcontainer an:</p><p><span id="more-3888"></span><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud1.png"><img class="alignnone size-full wp-image-3889" style="border: 0pt none;" title="Zend Cloud Create Container" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud1.png" alt="" width="710" height="436" /></a></p><p>Das gewählte Passwort ist, wie dort auch zu lesen ist, gleichzeitig auch das MySQL Passwort und das Passwort für die Zend Server Oberfläche. Es gibt die Möglichkeit einen SSH-Key hochzuladen oder ein neues Paar generieren zu lassen. Diese werden später für die Git und SFTP Verbindungen benötigt.</p><p>Den Container kann man auch administrieren: Snapshots erstellen, Zurücksetzen und Löschen. Während der Beta kann man auch weitere Container anfordern.</p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud2.png"><img class="alignnone size-full wp-image-3891" style="border: 0pt none;" title="Zend Cloud Container List" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud2.png" alt="" width="708" height="448" /></a></p><p>Der neue Container enthält dann eine Default-Application, die wir nun verwalten können. Auf der Seite erscheint eine phpcloud Willkommensseite. Wir können mit einem Klick nun weitere leere Applikationen erstellen oder auch andere vorgefertigte Applikationen installieren:</p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud3.png"><img class="alignnone size-full wp-image-3892" style="border: 0pt none;" title="Zend Cloud Add Application" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud3.png" alt="" width="708" height="1081" /></a></p><p>Die neue Applikation können wir nun direkt aufrufen. Wir können den Code natürlich auch verändern, und zwar entweder via GIT oder via SFTP. Zend Studio bietet eine gute Integration, dort ist es etwas einfacher die Applikation einzubinden, aber prinzipiell kann natürlich jeder Client genutzt werden der GIT oder SFTP Support bietet. Hier beispielsweise mit <a href="http://www.phpgangsta.de/tag/phpstorm" target="_blank">PHPStorm</a> per SFTP:</p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud8.png"><img class="alignnone size-full wp-image-3897" style="border: 0pt none;" title="Zend Cloud in PHPStorm via SFTP" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud8.png" alt="" width="693" height="614" /></a></p><p>PHPStorm beschwert sich wenn kein passender Public Key gefunden wird, den kann man aber herunterladen von der phpcloud Administrationsoberfläche. Die Verzeichnisstruktur ist auf den ersten Blick kompliziert da dort auch mit Versionen hantiert werden kann. Uns interessiert erstmal nur der untere public-Ordner der Default Application: applications/container-root/public den wir als Project-Root festlegen. blog1 ist übrigens eine 1-Click-Wordpress-Blog-Application.</p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud9.png"><img class="alignnone size-full wp-image-3898" style="border: 0pt none;" title="Zend Cloud Verzeichnisstruktur" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud9.png" alt="" width="693" height="619" /></a></p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud10.png"><img class="alignnone size-full wp-image-3899" style="border: 0pt none;" title="Zend Cloud in PHPStorm" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud10.png" alt="" width="711" height="521" /></a></p><p>Und schon kann in der Cloud programmiert werden, bei jedem Speichervorgang wird die Datei per SFTP hochgeladen. Wer lieber mit Versionskontrolle, in diesem Fall GIT arbeitet, kann das natürlich auch wunderbar tun.</p><p>Wenn man Code Tracing aktiviert kann man auch online Requests untersuchen, extrem cool!</p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud7.png"><img class="alignnone size-full wp-image-3895" style="border: 0pt none;" title="Zend Cloud Application List" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud7.png" alt="" width="707" height="456" /></a></p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud6.png"><img class="alignnone size-full wp-image-3896" style="border: 0pt none;" title="Zend Cloud Code Tracing" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud6.png" alt="" width="709" height="400" /></a></p><p>Der Container kann nun auch via Zend Server GUI gemonitored und administriert werden. Der Zend Server ist ziemlich mächtig und es macht viel Spass damit zu arbeiten. Für Details sollte man es sich selbst angucken, einige Stichworte sind Events, Jobs, Queue, Logs, Rules, php.ini Einstellungen, Monitoring usw.</p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud4.png"><img class="alignnone size-full wp-image-3893" style="border: 0pt none;" title="Zend Cloud Zend Server GUI" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud4.png" alt="" width="710" height="478" /></a></p><p>Bei ausgehenden E-Mails hat Zend das selbe Problem wie alle Cloud-Provider, selbst versenden kann die Cloud nicht und benötigt einen externen Mail-Server der das übernimmt.</p><p><a href="http://www.phpgangsta.de/wp-content/uploads/zendcloud5.png"><img class="alignnone size-full wp-image-3894" style="border: 0pt none;" title="Zend Cloud Outgoing E-Mail Settings" src="http://www.phpgangsta.de/wp-content/uploads/zendcloud5.png" alt="" width="709" height="487" /></a></p><p>Insgesamt eine sehr nette Cloud muss man sagen. Wie gesagt aktuell Beta und nur mit Einladung, wer Interesse hat sollte sich also <a href="https://my.phpcloud.com/invite-friend/request-key" target="_blank">vormerken</a> und auf eine Einladung warten. Die Features sind im großen und ganzen mit anderen Mitbewerbern vergleichbar (PHP 5.3, SFTP, GIT), nur der mächtige Zend Server sticht etwas heraus. Die mitgelieferte Job-Queue überragt auch die meisten anderen, ebenso wie Code-Tracing, das umfangreiche Monitoring und Event-Handling. Zur Zeit fehlt aber Unterstützung für Memcached, CouchDB/MongoDB und andere Dinge die man so brauchen könnte. Bin sehr gespannt wann die kommen und wie die Preisstrukturen später aussehen werden.</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/php-clouds-und-platform-as-a-service-paas-ubersicht' rel='bookmark' title='PHP Clouds und Platform as a Service (PaaS): Übersicht'>PHP Clouds und Platform as a Service (PaaS): Übersicht</a></li><li><a href='http://www.phpgangsta.de/php-clouds-und-platform-as-a-service-paas-cloudcontrol' rel='bookmark' title='PHP Clouds und Platform as a Service (PaaS): cloudControl'>PHP Clouds und Platform as a Service (PaaS): cloudControl</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/php-clouds-und-platform-as-a-service-paas-phpcloud-von-zend/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Velocity Europe Tag 2: Whao!</title><link>http://www.phpgangsta.de/velocity-europe-tag-2-whao</link> <comments>http://www.phpgangsta.de/velocity-europe-tag-2-whao#comments</comments> <pubDate>Fri, 11 Nov 2011 11:57:24 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[Conference]]></category> <category><![CDATA[Konferenz]]></category> <category><![CDATA[Velocity]]></category> <category><![CDATA[VelocityEU]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3927</guid> <description><![CDATA[Speeeed! Genauso wie der letzte Tag geendet hat beginnt der zweite. Steve und John eröffnen den zweiten Tag mit einer kurzen Opening Keynote, gefolgt von Jeff Veen der von den Problemen berichtet als Typekit einige Tage vor Weihnachten vom Erfolg überrollt wurde, und wie innerhalb eines Wochenendes das Problem kurzerhand gelöst werden musste und auch [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/velocity-europe-tag-1-der-vormittag' rel='bookmark' title='Velocity Europe Tag 1: Der Vormittag'>Velocity Europe Tag 1: Der Vormittag</a></li><li><a href='http://www.phpgangsta.de/velocity-europe-tag-1-die-sessions-am-nachmittag' rel='bookmark' title='Velocity Europe Tag 1: Die Sessions am Nachmittag'>Velocity Europe Tag 1: Die Sessions am Nachmittag</a></li><li><a href='http://www.phpgangsta.de/fast-by-default-%e2%80%93-o%e2%80%99reilly-media%e2%80%99s-velocity-konferenz-kommt-nach-berlin' rel='bookmark' title='Fast by Default – O’Reilly Media’s Velocity Konferenz kommt nach Berlin!'>Fast by Default – O’Reilly Media’s Velocity Konferenz kommt nach Berlin!</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Speeeed! Genauso wie der letzte Tag geendet hat beginnt der zweite.</p><p>Steve und John eröffnen den zweiten Tag mit einer kurzen Opening Keynote, gefolgt von Jeff Veen der von den Problemen berichtet als <a href="https://typekit.com/" target="_blank">Typekit</a> einige Tage vor Weihnachten vom Erfolg überrollt wurde, und wie innerhalb eines Wochenendes das Problem kurzerhand gelöst werden musste und auch wurde. Das Grundproblem waren die vielen Kits die nicht zeitnah in das CDN gebracht werden konnten, und sich so eine massive Queue aufgebaut hatte. Ich mag solche praxisnahen Einsichten sehr. Eine These bzw. Grundsatz der Kultur der Firma: IRC über E-Mail. Im IRC kann man kurze Fragen und Antworten schreiben wie &#8220;no&#8221;. In E-Mails haben wir irgendwie den Zwang, formal zu schreiben und viele Sätze zu bilden. Das bläht schnelle interne Kommunikation unnötig auf.</p><p><span id="more-3927"></span>Die folgenden zwei Lighning Demos stellten kurz <a href="http://ajax.dynatrace.com/ajax/en/" target="_blank">Dynatrace Ajax Edition</a> und FITB vor. Dynatrace ist eines der führenden Tools um sehr tief in Browser hereinschauen zu können (auch IE6/7!) und so Reflowes, Repaints usw sehen zu können und komfortabel Performance-Bottlenecks zu finden, die man ohne solche Einsichten nicht oder nur sehr schlecht eingrenzen kann. <a href="https://github.com/lozzd/FITB" target="_blank">FITB</a> ist ein PHP-basiertes Tool um Netzwerke zu monitoren und Graphen zu erstellen. Mit einer Zeile in der Konfiguration werden neue Switches hinzugefügt, alle aktiven Ports werden automatisch erkannt und Graphen erstellt.</p><p>Weiter ging es mit Arnaud Becard von ip-label, er zeigt auf wie wichtig Real User Monitoring (RUM) ist, und warum das wichtiger ist als künstliche Messwerte von einfachen Tools. Gerade unterschiedliche Bandbreiten (schnelles DSL, ISDN, Mobile), aber auch Browsergenerationen einzeln zu betrachten ist sehr sinnvoll. Auch Kleinigkeiten wie beispielsweise der Umstieg von HTTP 1.0 auf HTTP 1.1 mit KeepAlives kann bis zu 30% Performance Unterschied bringen!</p><p>John, einer der Mitorganisatoren und Moderatoren zeigt auf wie unmöglich es ist, Systeme ohne Fehler zu erstellen. Gerade bei Systemen wo man wirklich darauf achtet wie Amazon, Blackberry oder auch die Challenger Katastrophe zeigen dass man mit Ausfällen leben muss, es geht einzig darum sie möglichst schnell in den Griff zu bekommen und die Konsequenzen gering zu halten. Dazu gehören neben vielen anderen Dingen auch vor allem die Überlegungen vorher was alles passieren könnte (was mit viel Erfahrung natürlich besser gelingt), aber auch ein durchdachtes Troubleshooting und Kommunikation. Was passiert wenn das Netz ins Rechenzentrum ausfällt, möchte man dann Shellkommandos durchs Telefon durchsagen oder möchte man vor Ort einen Notfallplan liegen haben? Das Lernen aus Vorfällen ist auch ein sehr wichtiger Punkt. Messen ob Gegenmaßnahmen in der Zukunft gegriffen haben. Vor großen Änderungen und Deploys schreibt jeder Mitarbeiter eine Liste mit Dingen die passieren könnten&#8230;Wenn man noch nie einen Ausfall hatte wird der nächste Ausfall schlimm werden, wenn man öfter Ausfälle hat wird der nächste schnell und gut gelöst. Übung und Vorbereitung macht den Meister!</p><p>Dann betrat Artur Bergmann die Bühne, ein Veteran der Velocity-Konferenzen. So ganz genau kann man seinen Vortrag nicht zusammenfassen, im Prinzip ging es glaube ich darum zu zeigen dass man sich mit der Materie auseinander setzen sollte mit der man arbeitet, und generell sind Computer, Kernel und Tools kacke bis auf sehr wenige Ausnahmen. Wenn man in irgendwelchen Graphen Load-Spitzen erkennt tippt man zuerst auf die Applikationen, aber auch der Linux-Kernel ist laut Artur kaputt und schlecht dokumentiert, man sollte sie nie auf Magic verlassen. Seinen alten Jeep mag er deutlich lieber als einen Porsche Cayenne, da man ihn leicht verstehen, reparieren und erweitern kann. Ich hätte auch mal mitzählen sollen wie oft er &#8220;What the fuck&#8221; gesagt hat <img src='http://www.phpgangsta.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><p>Bei <a href="http://www.spilgames.com/" target="_blank">Spil Games</a>, einem der führenden Spieleanbieter hat man mit 140 Millionen Unique Users pro Monat zu tun, und um User zu binden und zu gewinnen benötigt man vor allem eines: Geschwindigkeit! Wenn ein Spiel erst nach 15 Sekunden startet ist ein User wieder weg, wenn es nach 7 Sekunden da ist und das schneller ist als bei der Konkurrenz, dann bleiben sie und spielen wie verrückt. Dabei gilt es auch an langsame Verbindungen zu denken, Usern in Brasilien sollte man beispielsweise vorzugsweise bandbreitenschonende Spiele anbieten. Benutzer sind der Schlüssel, die Erfahrung der Benutzer, und dazu gehört eine gute Performance. Performance ist kein Projekt das ein Ende hat, sondern eine andauernde Mission. Focus: 5 Mitarbeiter wegschicken und nur an Performance arbeiten lassen ab und zu, aber auch permanent dran arbeiten. Wenn man einen Request um 4Sekunden verkürzen kann und das 1 Tag dauert: Machen! Messen messen messen und nie wieder langsamer werden, nur schneller, es gibt keine Ausnahmen und Entschuldigungen. Einblicke gewinnen, Multi Varianten Tests und A/B Tests, Aufschlüsselung von Messdaten nach Land, Spieltyp usw., auch in Staging Environment messen vor Deploy&#8230; Lernen: Bücher, Velocity Videos, Google Analytics Site Speed, CDNs, head.js, css/js/images kombinieren Low hanging fruits finden&#8230; Von 5s DOM Load auf 360ms DOM Load, und von 11s Full Page Load auf 4s Full Page Load.. An durchschnittlichem Samstag spart das den Usern 4 Jahre Wartezeit!</p><p>Beim nächsten größeren Block haben sowohl Opera als auch Chrome und Firefox über aktuelle Entwicklungen im Bereich Performance erzählt.</p><p>Opera arbeitet an SSL False Start, verbesserten Netwerkstack, Strict Transport Security, Opera Turbo, Opera Dragonfly als Remote Debugger vor allem für mobile Geräte, Opera Mini, angenehmeres und ruckelfreies Scrollen gerade auf schwachbrüstigen Geräten usw.</p><p>Tony Gentilcore von Google berichtet über Chrome Features, von <a href="http://code.google.com/intl/de-DE/chrome/chromeframe/" target="_blank">Chrome Frame</a> für den IE mit <a href="http://www.chromium.org/developers/how-tos/chrome-frame-getting-started#TOC-Detecting-Google-Chrome-Frame-and-P" target="_blank">Aufforderung im IE zur Installation</a>, <a href="http://code.google.com/intl/de-DE/chrome/whitepapers/prerender.html" target="_blank">&lt;link rel=&#8221;prerender&#8221;&gt;</a>, <a href="http://code.google.com/intl/de-DE/chrome/whitepapers/pagevisibility.html" target="_blank">webkitvisibilitychange event</a>, Developer Tools verbessert (Timeline, Memory Profiler), <a href="http://paulirish.com/2011/requestanimationframe-for-smart-animating/" target="_blank">requestAnimationFrame</a> und einiges mehr.</p><p>Chris Heilmann von Mozilla gab bewußt keinerlei Zahlen im Detail für Firefox, denn die sind in sehr wenigen Wochen schon wieder outdated. Generell berichtete er von der Wichtigkeit von Browsern, dass es dem User generell freisteht welchen Browser er benutzt. Kurz riss er einige neue Features an wie die Web Console, Style Inspector, Scratchpad, Navigating visually, Sourcemapping im Javascriptbereich (Coffeescript), <a href="http://hacks.mozilla.org/2011/07/tilt-visualize-your-web-page-in-3d/" target="_blank">TILT</a> um HTML-Verschachtelungen darzustellen.</p><p>Ramon erzählte über Hyves, dem sehr beliebten holländischen Sozialen Netzwerk. Bei 16,7 Millionen Niederländern hat Hyves 9,7 Millionen Accounts und 2 Millionen Unique Visitors pro Tag. Die Last wird mit 3500 Servern in 3 Rechenzentren bewältigt, 6Gbit Bandbreite, 12 Entwickler, 33 Entwickler. Einer dieser Entwickler hat an einem Wochenende <a href="http://www.phpgangsta.de/tag/hiphop" target="_blank">HipHop for PHP</a> ausprobiert und dabei eine 3-7 fache Performance feststellen können. Mit dieser Aussicht macht man sich daran es für einen Teil der Seiten einzusetzen, dabei entstand ein Binary von 750MB Größe, das auf 700 Frontend-Server deployed werden mußte. Die Kompilierung dauert anfangs 40-60 Minuten, nach massiven Verbesserungen und neuer Hardware konnte das auf &lt;10 Minuten gedrückt werden. Probleme wie eval, Destruktoren etc. wurden beseitigt. Mit Hilfe von Jenkins und sollte das Deployment passieren, ein serielles Ausrollen kam nicht in Frage (bei 1Gbit Netzwerk würde das bei 700 Servern sehr lang dauern), nur ein Diff der Binarys deployen kommt nicht in Frage da das Diff teilweise 400MB groß ist. Erste Lösung: Bittorrent: Gemacht in Live Umgebung: Totalausfall des Netzwerkes, da alle Leitungen und Switches überlastet wurden über viele Minuten, selbst Admin-Zugang nicht mehr möglich. Danach <a href="http://engineering.twitter.com/2010/07/murder-fast-datacenter-code-deploys.html" target="_blank">Murder von Twitter</a> angeschaut, einen eigenen Tracker geschrieben, einen modifizierten rtorrent-Client ohne DHT und UPNP etc., Definition von mehreren Schwärmen um die Rechenzentren zu trennen, Begrenzung im Client auf 90Mbit usw..</p><p>Johannes Mainusch von Xing plauderte auch etwas aus dem Nähkästchen, von Problemen beim Messen der Performance, nur jeder 200. Besucher schickt Messdaten an den Server. onbeforeunload() Cookie setzen, auf nächster Seite Zeit messen bei onLoad. Wenn Benutzer in das Login Formular klickt werden schonmal einige Bilder vorgeladen die auf der nächsten Seite gebraucht werden. Tweets pro Tag werden gemessen und vieles vieles mehr. Unter anderem auch Anzahl der Registrierungsmails, Anzahl Anleitung nach erstem Login, Anzahl Passwort vergessen, Benutzungen des <a href="www.youtube.com/watch?v=rIY5vlWRdME" target="_blank">Handshake-Features</a> per Google Earth und kml.</p><p>Bradley Heilbrun von YouTube bzw. Google konzentrierte sich speziell auf das Thema HTTP Connection Handling. Was tut man wenn man mit 6 Servern beginnt und überrollt wird und sehr schnell skalieren muss? Hunderttausende von gleichzeitigen Verbindungen müssen gehalten werden, und wenn Apache für jede Connection einen Prozess startet? Man benötigt einen guten Loadbalancer bzw. spezialisierte Software, die das kann, und idle-Connections halten kann. nur Requests gehen dann durch auf die Backend-Webserver, die früher mit mod_php und mpm_prefork liefen. Besser: FastCGI und mpm_worker, bessere Skalierungsmöglichkeiten. Weiter hilfreich: URL Routing. Später dann Probleme als man &gt; 5 IPs im DNS veröffentlichen wollte, &gt;512 Byte, Umschwenk von UDP auf TCP. Dann wurde es nötig mit Direct-Server-Return zu arbeiten und 2 Load-Balancer-Schichten einzuführen. Bei Global Server Load Balancing (GSLB) sind Länder-Subdomains (us.youtube.com, eu.youtube.com &#8230;) doof, Indizierungsprobleme, Bookmarks usw&#8230; Anycast doof. Besser Geo-DNS.</p><p>So, das war es im groben Überblick, es war unglaublich wie viele interessante Eindrücke ich gesammelt habe, hoch interessant wenn solche großen Firmen und Weltmarkführer ihre Erfahrungen vermitteln, da könnte ich wochenlang zuhören. Eine wirklich tolle Konferenz ist nun zuende, und ich würde jedem empfehlen an der nächsten Velocity Europe teilzunehmen wenn möglich, es lohnt sich auf jeden Fall!</p><p>Übrigens bemerkenswert war das Vorhandensein eine Übersetzers in Gebärdensprache, cool!</p><p><a href="http://www.phpgangsta.de/wp-content/uploads/IMAG0128.jpg" target="_blank"><img class="alignnone size-medium wp-image-3932" style="border: 0pt none;" title="IMAG0128" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0128-300x179.jpg" alt="" width="300" height="179" /></a><a href="http://www.phpgangsta.de/wp-content/uploads/IMAG0130.jpg" target="_blank">  <img class="alignnone size-medium wp-image-3933" style="border: 0pt none;" title="IMAG0130" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0130-300x179.jpg" alt="" width="300" height="179" /></a></p><p><a href="http://www.phpgangsta.de/wp-content/uploads/IMAG0131.jpg" target="_blank"><img class="alignnone size-medium wp-image-3934" style="border: 0pt none;" title="IMAG0131" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0131-300x179.jpg" alt="" width="300" height="179" /></a><a href="http://www.phpgangsta.de/wp-content/uploads/IMAG0137.jpg" target="_blank">  <img class="alignnone size-medium wp-image-3935" style="border: 0pt none;" title="IMAG0137" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0137-300x179.jpg" alt="" width="300" height="179" /></a></p><p><a href="http://www.phpgangsta.de/wp-content/uploads/IMAG0138.jpg" target="_blank"><img class="alignnone size-medium wp-image-3936" style="border: 0pt none;" title="IMAG0138" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0138-300x179.jpg" alt="" width="300" height="179" /></a><a href="http://www.phpgangsta.de/wp-content/uploads/IMAG0139.jpg" target="_blank">  <img class="alignnone size-medium wp-image-3937" style="border: 0pt none;" title="IMAG0139" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0139-300x179.jpg" alt="" width="300" height="179" /></a></p><p><a href="http://www.phpgangsta.de/wp-content/uploads/IMAG0141.jpg" target="_blank"><img class="alignnone size-medium wp-image-3938" style="border: 0pt none;" title="IMAG0141" src="http://www.phpgangsta.de/wp-content/uploads/IMAG0141-300x179.jpg" alt="" width="300" height="179" /></a></p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/velocity-europe-tag-1-der-vormittag' rel='bookmark' title='Velocity Europe Tag 1: Der Vormittag'>Velocity Europe Tag 1: Der Vormittag</a></li><li><a href='http://www.phpgangsta.de/velocity-europe-tag-1-die-sessions-am-nachmittag' rel='bookmark' title='Velocity Europe Tag 1: Die Sessions am Nachmittag'>Velocity Europe Tag 1: Die Sessions am Nachmittag</a></li><li><a href='http://www.phpgangsta.de/fast-by-default-%e2%80%93-o%e2%80%99reilly-media%e2%80%99s-velocity-konferenz-kommt-nach-berlin' rel='bookmark' title='Fast by Default – O’Reilly Media’s Velocity Konferenz kommt nach Berlin!'>Fast by Default – O’Reilly Media’s Velocity Konferenz kommt nach Berlin!</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/velocity-europe-tag-2-whao/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Linkpool Nummer 25</title><link>http://www.phpgangsta.de/linkpool-nummer-25</link> <comments>http://www.phpgangsta.de/linkpool-nummer-25#comments</comments> <pubDate>Sun, 06 Nov 2011 07:00:52 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Lesepool]]></category> <category><![CDATA[Linkpool]]></category> <category><![CDATA[Links]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3814</guid> <description><![CDATA[Gute Übersicht über Fallstricke in HTML-E-Mails: http://maddesigns.de/html-newsletter-1030.html Google nutzt auch POST Requests zum Indizieren von Webseiten: http://googlewebmastercentral.blogspot.com/2011/11/get-post-and-safely-surfacing-more-of.html Sehr cooler und ausführlicher Artikel über Kryptologie: http://bigwhoop.ch/artikel/105/2011-10-20/ein-ausflug-in-die-kryptologie Wie erkenne ich dass ich ein schlechter Programmierer bin: http://badprogrammer.infogami.com/ Videomitschnitt Patrick Lauke über &#8220;Handys und Tablets: Websiteentwicklung jenseits des Desktops&#8221; auf der IPC11: http://entwickler.de/zonen/portale/psecom,id,99,news,60802.html Gute Übersicht über Encoding-Probleme, wo [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/linkpool-nummer-20' rel='bookmark' title='Linkpool Nummer 20'>Linkpool Nummer 20</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-22' rel='bookmark' title='Linkpool Nummer 22'>Linkpool Nummer 22</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-15' rel='bookmark' title='Linkpool Nummer 15'>Linkpool Nummer 15</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Gute Übersicht über Fallstricke in HTML-E-Mails:</p><ul><li><a href="http://maddesigns.de/html-newsletter-1030.html" target="_blank">http://maddesigns.de/html-newsletter-1030.html</a></li></ul><p>Google nutzt auch POST Requests zum Indizieren von Webseiten:</p><ul><li><a href="http://googlewebmastercentral.blogspot.com/2011/11/get-post-and-safely-surfacing-more-of.html" target="_blank">http://googlewebmastercentral.blogspot.com/2011/11/get-post-and-safely-surfacing-more-of.html</a></li></ul><p>Sehr cooler und ausführlicher Artikel über Kryptologie:</p><ul><li><a href="http://bigwhoop.ch/artikel/105/2011-10-20/ein-ausflug-in-die-kryptologie" target="_blank">http://bigwhoop.ch/artikel/105/2011-10-20/ein-ausflug-in-die-kryptologie</a></li></ul><p>Wie erkenne ich dass ich ein schlechter Programmierer bin:</p><ul><li><a href="http://badprogrammer.infogami.com/" target="_blank">http://badprogrammer.infogami.com/</a></li></ul><p>Videomitschnitt Patrick Lauke über &#8220;Handys und Tablets: Websiteentwicklung jenseits des Desktops&#8221; auf der IPC11:</p><ul><li><a href="http://entwickler.de/zonen/portale/psecom,id,99,news,60802.html" target="_blank">http://entwickler.de/zonen/portale/psecom,id,99,news,60802.html</a></li></ul><p>Gute Übersicht über Encoding-Probleme, wo sie auftreten und wie man es richtig macht:</p><ul><li><a href="http://www.codenaschereien.de/php/php-probleme-umlaute-sonderzeichen" target="_blank">http://www.codenaschereien.de/php/php-probleme-umlaute-sonderzeichen</a></li></ul><p>Einige interessante und nützliche .htaccess Rules:</p><ul><li><a href="http://www.catswhocode.com/blog/10-htaccess-snippets-to-optimize-your-website" target="_blank">http://www.catswhocode.com/blog/10-htaccess-snippets-to-optimize-your-website</a></li></ul><p>PHP Core Diskussion: Soll PSR-0 Autoloading in PHP integriert werden? Eine Meinung:</p><ul><li><a href="http://blog.ircmaxell.com/2011/11/on-psr-0-being-included-in-phps-core.html" target="_blank">http://blog.ircmaxell.com/2011/11/on-psr-0-being-included-in-phps-core.html</a></li></ul> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/linkpool-nummer-20' rel='bookmark' title='Linkpool Nummer 20'>Linkpool Nummer 20</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-22' rel='bookmark' title='Linkpool Nummer 22'>Linkpool Nummer 22</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-15' rel='bookmark' title='Linkpool Nummer 15'>Linkpool Nummer 15</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/linkpool-nummer-25/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Das Test-Fax-Projekt kurz vorgestellt</title><link>http://www.phpgangsta.de/das-test-fax-projekt-kurz-vorgestellt</link> <comments>http://www.phpgangsta.de/das-test-fax-projekt-kurz-vorgestellt#comments</comments> <pubDate>Fri, 04 Nov 2011 08:54:21 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[Javascript]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Cronjob]]></category> <category><![CDATA[Fax]]></category> <category><![CDATA[Fax empfangen]]></category> <category><![CDATA[Faxgerät testen]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3847</guid> <description><![CDATA[Mir ist aufgefallen dass ich noch gar nichts über mein Test-Fax-Projekt geschrieben habe. Um etwas mit Fax-Dokumenten zu arbeiten und zu spielen habe ich vor einigen Monaten die kleine Webseite http://www.test-fax.de erstellt. Dort kann man sein neues Fax-Gerät oder seine neue Fax-Software testen indem man einfach ein Fax an die angezeigte Nummer schickt. Das empfangene [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p><img class="size-medium wp-image-3855 alignright" title="testfax" src="http://www.phpgangsta.de/wp-content/uploads/testfax-300x268.png" alt="" width="240" height="214" />Mir ist aufgefallen dass ich noch gar nichts über mein Test-Fax-Projekt geschrieben habe. Um etwas mit Fax-Dokumenten zu arbeiten und zu spielen habe ich vor einigen Monaten die kleine Webseite <a href="http://www.test-fax.de" target="_blank">http://www.test-fax.de</a> erstellt. Dort kann man sein neues Fax-Gerät oder seine neue Fax-Software testen indem man einfach ein Fax an die angezeigte Nummer schickt.</p><p>Das empfangene Fax landet in einem IMAP-Postfach, das ich mit PHP periodisch abfrage. Falls ein Fax, das in diesem Fall ein tiff-Anhang an der E-Mail ist, vom Cronjob-Script gefunden wird, extrahiere ich den Anhang, wandle es in ein png Bild um, erstelle ein Vorschaubild und trage es in eine Datenbank ein. Die Webseite ist dann einfach nur eine Anzeige der empfangenen Faxe, wobei es auch eine kleine Javascript-Funktionalität gibt die das Backend alle 10 Sekunden nach neu empfangenen Fax-Bildern befragt.</p><p><span id="more-3847"></span>Genutzt habe ich das Zend Framework und MooTools, und es brauchte ungefähr 400 Zeilen eigenen Code: 150 Zeilen PHP, 100 Zeilen HTML, 100 Zeilen CSS und 50 Zeilen Javascript.</p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/das-test-fax-projekt-kurz-vorgestellt/feed</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>Info über MySQL Zertifizierungen?</title><link>http://www.phpgangsta.de/info-uber-mysql-zertifizierungen</link> <comments>http://www.phpgangsta.de/info-uber-mysql-zertifizierungen#comments</comments> <pubDate>Wed, 02 Nov 2011 08:59:29 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Certification]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[ZCE]]></category> <category><![CDATA[Zertifikat]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3835</guid> <description><![CDATA[Ich plane schon länger eine weitere Zertifizierung zu machen, nachdem die Zend Certified Engineer Prüfung letztes Jahr so gut geklappt hat. Es gibt auch einige Zertifikate die mich interessieren würden: ZCE PHP 5.3 &#8211; wäre ein schönes Update zu meinem ZCE PHP 5, für &#60; 75 Euro würd ich drüber nachdenken, aber 195 Euro ist [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/praxis-workshop-php-basics-web-basierte-systeme-mit-php-und-mysql' rel='bookmark' title='Praxis-Workshop PHP Basics: Web-basierte Systeme mit PHP und MySQL'>Praxis-Workshop PHP Basics: Web-basierte Systeme mit PHP und MySQL</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Ich plane schon länger eine weitere Zertifizierung zu machen, nachdem die <a href="http://www.phpgangsta.de/tag/zce" target="_blank">Zend Certified Engineer</a> Prüfung letztes Jahr so gut geklappt hat. Es gibt auch einige Zertifikate die mich interessieren würden:</p><ul><li><a href="http://shop.zend.com/de/php-certification/zend-php5-certification-voucher.html" target="_blank">ZCE PHP 5.3</a> &#8211; wäre ein schönes Update zu meinem ZCE PHP 5, für &lt; 75 Euro würd ich drüber nachdenken, aber 195 Euro ist mir für das Update doch etwas zu viel</li><li>ZCE-ZF die <a href="http://shop.zend.com/de/zf-certification/zend-framework-certification-voucher.html" target="_blank">Zend Framework Zertifizierung</a>. Da ich täglich mit dem Zend Framework arbeite ist das schon länger auf meiner Liste, aber da in wenigen Monaten (Schätzung von Matthew Weier O&#8217;Phinney ist April 2012) Version 2.0 erscheinen wird wollte ich noch darauf warten, sonst stehe ich bald vor dem selben Problem wie oben. Da gedulde ich mich noch ein wenig.</li><li><a href="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=332" target="_blank">Oracle Certified Professional, MySQL 5 Developer</a>. Besteht aus 2 Prüfungen die jeweils 154 Euro kosten. Mit MySQL hat man auch fast jeden Tag zu tun.</li></ul><p>Ich habe auf der Suche danach zwei Dinge gefunden: Eine 5 Tage <a href="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getCourseDesc?dc=D61830GC10" target="_blank">MySQL for Developers</a> Schulung für 2200 Euro und ein <a href="http://www.amazon.de/gp/product/0672328127/ref=as_li_ss_tl?ie=UTF8&amp;tag=warha40kgalle-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=0672328127" target="_blank">Certification Study Guide</a> für 44 Euro.</p><p>Gibt es noch weitere interessante Zertifizierungen für einen Webentwickler die sich lohnen?</p><p>Hat jemand von euch schon die MySQL Prüfungen gemacht? Hat jemand von euch eventuell Lernmaterial, beispielsweise das oben genannte Buch günstig zu verkaufen?</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/praxis-workshop-php-basics-web-basierte-systeme-mit-php-und-mysql' rel='bookmark' title='Praxis-Workshop PHP Basics: Web-basierte Systeme mit PHP und MySQL'>Praxis-Workshop PHP Basics: Web-basierte Systeme mit PHP und MySQL</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/info-uber-mysql-zertifizierungen/feed</wfw:commentRss> <slash:comments>9</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: basic
Database Caching 1/138 queries in 1.474 seconds using disk: basic
Object Caching 5695/5773 objects using disk: basic

Served from: www.phpgangsta.de @ 2012-02-08 01:16:04 -->
