<?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</title> <atom:link href="http://www.phpgangsta.de/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>Ausfallsichere, skalierbare und sichere Hosting-Lösung von maxcluster zu gewinnen!</title><link>http://www.phpgangsta.de/ausfallsichere-skalierbare-und-sichere-hosting-losung-von-maxcluster-zu-gewinnen</link> <comments>http://www.phpgangsta.de/ausfallsichere-skalierbare-und-sichere-hosting-losung-von-maxcluster-zu-gewinnen#comments</comments> <pubDate>Wed, 01 Feb 2012 08:38:45 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[Cluster Hosting]]></category> <category><![CDATA[Gewinnspiel]]></category> <category><![CDATA[IaaS]]></category> <category><![CDATA[maxcluster]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4236</guid> <description><![CDATA[Mit einer spannenden Aktion möchte ich in den Februar starten. Der Anbieter maxcluster stellt zwei Produkte für eine Laufzeit von 6 Monaten zur Verfügung mit einem Gesamtwert von über 2300€! Was gibt es genau zu gewinnen? Application Cluster mit einer Konfiguration von 6 CPUs, 8 GB RAM, 200 GB HDD, 20 GB Netzwerk-Storage und 500 [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/php-magazin-jahresabos-zu-gewinnen' rel='bookmark' title='PHP Magazin Jahresabos zu gewinnen'>PHP Magazin Jahresabos zu gewinnen</a></li><li><a href='http://www.phpgangsta.de/weihnachtsgewinnspiel-bei-antwerpes-arduino-zu-gewinnen' rel='bookmark' title='Weihnachtsgewinnspiel bei antwerpes: Arduino zu gewinnen'>Weihnachtsgewinnspiel bei antwerpes: Arduino zu gewinnen</a></li><li><a href='http://www.phpgangsta.de/php-test-fur-fortgeschrittene-zce-tests-zu-gewinnen' rel='bookmark' title='PHP-Test für Fortgeschrittene | ZCE Tests zu gewinnen'>PHP-Test für Fortgeschrittene | ZCE Tests zu gewinnen</a></li></ol>]]></description> <content:encoded><![CDATA[<p><a href="http://maxcluster.de/" target="_blank"><img class="alignright  wp-image-4237" style="border: 0pt none;" title="maxcluster" src="http://www.phpgangsta.de/wp-content/uploads/maxclusterlogo.png" alt="" width="214" height="34" /></a>Mit einer spannenden Aktion möchte ich in den Februar starten. Der Anbieter <a href="http://maxcluster.de/" target="_blank">maxcluster</a> stellt zwei Produkte für eine Laufzeit von 6 Monaten zur Verfügung mit einem Gesamtwert von über 2300€!</p><p>Was gibt es genau zu gewinnen?</p><ol><li>Application Cluster mit einer Konfiguration von 6 CPUs, 8 GB RAM, 200 GB HDD, 20 GB Netzwerk-Storage und 500 GB Traffic</li><li>Failover Cluster mit einer Konfiguration von 2 CPUs, 4 GB RAM, 100 GB HDD , 10 GB Netzwerk-Storage und 500 GB Traffic</li></ol><p><a href="http://maxcluster.de/magento-cluster-hosting" target="_blank"><img class="size-medium wp-image-4238 alignnone" style="border: 0pt none;" title="Failover Cluster" src="http://www.phpgangsta.de/wp-content/uploads/products-failover-cluster-architecture-300x74.jpg" alt="" width="300" height="74" /></a></p><p><strong>Wie kann man einen Cluster gewinnen?</strong></p><p>Beschreibe kurz in 2-3 Sätzen hier im Blog als Kommentar welches Projekt auf dem Cluster betrieben werden soll. Den Zuschlag bekommt das Projekt welches am faszinierendsten und interessantesten wirkt. Die Aktion läuft bis nächsten Dienstag Abend 23:59 (07.02.2012). <strong>Der Cluster kann gern von Start-Ups, Unternehmen oder privat genutzt werden.</strong></p><p>Vier Wochen nach der Vergabe würde ich mich über einen kurzen Erfahrungsbericht hier im Blog freuen, und maxcluster freut sich natürlich auch sehr über Verbesserungensvorschläge und Feedback aller Art.</p><blockquote><p>Die maxcluster GmbH stellt ausfallsichere, skalierbare und sichere virtuelle Cluster zur Verfügung. Die Infrastruktur wurde für Unternehmen mit anspruchsvollen Internetseiten und Anwendungen konzipiert und ist in Frankfurt beheimatet. Bereits ab einer monatlichen Gebühr von 59 Euro steht eine komplette Infrastruktur mit ausfallsicheren Servern, redundanten Storage, externer Firewall, täglichen Backups und Monitoring zur Verfügung, die sofort einsatzbereit ist. Neben vielen anderen Kunden und Projekten wird auch das <a href="http://wiwi.uni-paderborn.de/dep3/winfo2/forschung/projekte/paderborner-peer-instruction/" target="_blank">Paderborner Peer Instruction</a> Projekt unterstützt.</p></blockquote><p>Ich wünsche viel Erfolg bei dem Gewinnspiel! Vielen Dank an maxcluster für die Aktion!</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/php-magazin-jahresabos-zu-gewinnen' rel='bookmark' title='PHP Magazin Jahresabos zu gewinnen'>PHP Magazin Jahresabos zu gewinnen</a></li><li><a href='http://www.phpgangsta.de/weihnachtsgewinnspiel-bei-antwerpes-arduino-zu-gewinnen' rel='bookmark' title='Weihnachtsgewinnspiel bei antwerpes: Arduino zu gewinnen'>Weihnachtsgewinnspiel bei antwerpes: Arduino zu gewinnen</a></li><li><a href='http://www.phpgangsta.de/php-test-fur-fortgeschrittene-zce-tests-zu-gewinnen' rel='bookmark' title='PHP-Test für Fortgeschrittene | ZCE Tests zu gewinnen'>PHP-Test für Fortgeschrittene | ZCE Tests zu gewinnen</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/ausfallsichere-skalierbare-und-sichere-hosting-losung-von-maxcluster-zu-gewinnen/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <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>64</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>Meist gelesene Artikel, Besucherzahlen und Besucherzeiten von 2011 hier im Blog</title><link>http://www.phpgangsta.de/meist-gelesene-artikel-besucherzahlen-und-besucherzeiten-von-2011-hier-im-blog</link> <comments>http://www.phpgangsta.de/meist-gelesene-artikel-besucherzahlen-und-besucherzeiten-von-2011-hier-im-blog#comments</comments> <pubDate>Wed, 04 Jan 2012 09:10:57 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[Analytics]]></category> <category><![CDATA[Bester Artikel]]></category> <category><![CDATA[Besucherzahlen]]></category> <category><![CDATA[Besucherzeit]]></category> <category><![CDATA[Visitors]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4147</guid> <description><![CDATA[Hier eine Top 10 Liste der Artikel die die meisten Besucher angezogen haben: Die Zahlen sind natürlich mit Vorsicht zu genießen da einige Artikel so kurz sind dass sie komplett auf der Übersichtsseite erscheinen. Auch könnten die Zahlen verfälscht sein da ich ja einen Full-Feed anbiete, sodass eventuell Artikel mit Tabellen und Bildern Vorteile haben [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/gratulation-an-php-hates-me-fur-500-eindrucksvolle-artikel' rel='bookmark' title='Gratulation an &#8220;PHP Hates Me&#8221; für 500 eindrucksvolle Artikel!'>Gratulation an &#8220;PHP Hates Me&#8221; für 500 eindrucksvolle Artikel!</a></li><li><a href='http://www.phpgangsta.de/mein-artikel-uber-den-yubikey-im-phpmagazin-3-11' rel='bookmark' title='Mein Artikel über den Yubikey im PHP Magazin 3.11'>Mein Artikel über den Yubikey im PHP Magazin 3.11</a></li><li><a href='http://www.phpgangsta.de/blog-url-struktur-geandert' rel='bookmark' title='Blog URL Struktur geändert'>Blog URL Struktur geändert</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Hier eine Top 10 Liste der Artikel die die meisten Besucher angezogen haben:</p><table id="wp-table-reloaded-id-19-no-1" class="wp-table-reloaded wp-table-reloaded-id-19"><thead><tr class="row-1 odd"><th class="column-1">Platz</th><th class="column-2">Artikel</th><th class="column-3">Veröffentlichungsdatum</th><th class="column-4">Kommentare</th></tr></thead><tbody><tr class="row-2 even"><td class="column-1">10</td><td class="column-2"><a href="http://www.phpgangsta.de/html-5-und-javascript-5-clientseitige-datenbanken" target="_blank">HTML 5 und Javascript 5: Clientseitige Datenbanken</a></td><td class="column-3">6. Januar 2010</td><td class="column-4">7</td></tr><tr class="row-3 odd"><td class="column-1">9</td><td class="column-2"><a href="http://www.phpgangsta.de/schoener-hashen-mit-bcrypt" target="_blank">Schöner hashen mit bcrypt</a></td><td class="column-3">18. Juli 2011</td><td class="column-4">30</td></tr><tr class="row-4 even"><td class="column-1">8</td><td class="column-2"><a href="http://www.phpgangsta.de/php-in_array-die-performance-bremse" target="_blank">PHP in_array() die Performance-Bremse</a></td><td class="column-3">26. Januar 2011</td><td class="column-4">20</td></tr><tr class="row-5 odd"><td class="column-1">7</td><td class="column-2"><a href="http://www.phpgangsta.de/screenshots-von-webseiten-erstellen-mit-php" target="_blank">Screenshots von Webseiten erstellen mit PHP</a></td><td class="column-3">21. Juli 2011</td><td class="column-4">28</td></tr><tr class="row-6 even"><td class="column-1">6</td><td class="column-2"><a href="http://www.phpgangsta.de/mit-wetterdaten-arbeiten-yahoo-weather-api" target="_blank">Mit Wetterdaten arbeiten: Yahoo Weather API</a></td><td class="column-3">24. Januar 2011</td><td class="column-4">2</td></tr><tr class="row-7 odd"><td class="column-1">5</td><td class="column-2"><a href="http://www.phpgangsta.de/expires-header-und-komprimierung-aktivieren-im-apache2" target="_blank">Expires-Header und Komprimierung aktivieren im Apache2</a></td><td class="column-3">8. März 2010</td><td class="column-4">16</td></tr><tr class="row-8 even"><td class="column-1">4</td><td class="column-2"><a href="http://www.phpgangsta.de/pimcore-interessantes-opensource-cms" target="_blank">Pimcore – Interessantes OpenSource CMS</a></td><td class="column-3">23. Dezember 2010</td><td class="column-4">35</td></tr><tr class="row-9 odd"><td class="column-1">3</td><td class="column-2"><a href="http://www.phpgangsta.de/phpstorm-2-0-meine-favorisierte-ide-fur-php" target="_blank">PHPStorm 2.0 – meine favorisierte IDE für PHP</a></td><td class="column-3">22. März 2011</td><td class="column-4">46</td></tr><tr class="row-10 even"><td class="column-1">2</td><td class="column-2"><a href="http://www.phpgangsta.de/mit-wetterdaten-arbeiten-google-weather-api" target="_blank">Mit Wetterdaten arbeiten: Google Weather API</a></td><td class="column-3">18. Januar 2011</td><td class="column-4">7</td></tr><tr class="row-11 odd"><td class="column-1">1</td><td class="column-2"><a href="http://www.phpgangsta.de/passwortmythen-oder-%e2%80%9ewas-du-schon-immer-uber-passworter-wusstest-aber-nie-zu-sagen-wagtest%e2%80%9c" target="_blank">Passwortmythen oder "Was Du schon immer über Passwörter wusstest, aber nie zu sagen wagtest"</a></td><td class="column-3">11. Juli 2011</td><td class="column-4">82</td></tr></tbody></table><p><span id="more-4147"></span>Die Zahlen sind natürlich mit Vorsicht zu genießen da einige Artikel so kurz sind dass sie komplett auf der Übersichtsseite erscheinen. Auch könnten die Zahlen verfälscht sein da ich ja einen Full-Feed anbiete, sodass eventuell Artikel mit Tabellen und Bildern Vorteile haben wenn sie in Feed-Readern nicht so gut aussehen und die Besucher auf die Seite kommen. Neue Artikel die erst im Dezember geschrieben wurden hatten natürlich auch weniger Zeit Besucher zu sammeln.</p><p>Insgesamt war das Jahr 2011 besser als das Vorjahr was die Besucher pro Tag angeht. Aber man kann auch erkennen dass es kein riesen Sprung nach vorne war, ich muss nach wie vor um jeden Besucher kämpfen <img src='http://www.phpgangsta.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p><p><img class="alignnone size-full wp-image-4150" title="2011 Page Views" src="http://www.phpgangsta.de/wp-content/uploads/2011_page_views.png" alt="" width="714" height="139" /></p><p>Interessanterweise sieht man im nächsten Bild dass die durchschnittliche Besucherzeit etwas zurückgegangen ist, 2010 waren es 6:37 Minuten und 2011 waren es 5:24 Minuten. Ich weiß nicht ob das an kürzeren Artikeln lag oder ob einfach weniger rumgeklickt wurde da wiederkehrende Besucher eher weniger rumklicken als neue Besucher. Die wiederkehrenden Besucher sind von 45,4% im Jahr 2010 auf 50,2% im Jahr 2011 gestiegen.</p><p><img class="alignnone size-full wp-image-4151" title="2011 Visit Time" src="http://www.phpgangsta.de/wp-content/uploads/2011_visit_time.png" alt="" width="714" height="137" /></p><p>Ich bin nach wie vor dankbar für Ideen, Anmerkungen und Vorschläge für den Blog. Interessant ist übrigens dass die Gastartikel auf Platz 1, 4, 8 und 10 sind, es lohnt sich also für euch Gastartikel zu schreiben, sie werden gelesen!</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/gratulation-an-php-hates-me-fur-500-eindrucksvolle-artikel' rel='bookmark' title='Gratulation an &#8220;PHP Hates Me&#8221; für 500 eindrucksvolle Artikel!'>Gratulation an &#8220;PHP Hates Me&#8221; für 500 eindrucksvolle Artikel!</a></li><li><a href='http://www.phpgangsta.de/mein-artikel-uber-den-yubikey-im-phpmagazin-3-11' rel='bookmark' title='Mein Artikel über den Yubikey im PHP Magazin 3.11'>Mein Artikel über den Yubikey im PHP Magazin 3.11</a></li><li><a href='http://www.phpgangsta.de/blog-url-struktur-geandert' rel='bookmark' title='Blog URL Struktur geändert'>Blog URL Struktur geändert</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/meist-gelesene-artikel-besucherzahlen-und-besucherzeiten-von-2011-hier-im-blog/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Letzte Aktion in 2011: Server via IPv6 verfügbar machen</title><link>http://www.phpgangsta.de/letzte-aktion-in-2011-server-via-ipv6-verfugbar-machen</link> <comments>http://www.phpgangsta.de/letzte-aktion-in-2011-server-via-ipv6-verfugbar-machen#comments</comments> <pubDate>Sat, 31 Dec 2011 11:13:42 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[DNS]]></category> <category><![CDATA[Hoster]]></category> <category><![CDATA[IPv4]]></category> <category><![CDATA[IPv6]]></category> <category><![CDATA[Mailserver]]></category> <category><![CDATA[nginx]]></category> <category><![CDATA[Postfix]]></category> <category><![CDATA[webserver]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4119</guid> <description><![CDATA[So, damit es nicht heißt mein Blog wäre in 2011 nicht via IPv6 erreichbar gewesen ist meine letzte Aktion dieses Jahr meinen Webserver via IPv6 erreichbar zu machen. Da mein Hoster nun auch endlich IPv6 für virtuelle Server anbietet war das ziemlich einfach: Man mußte im Kundenbereich die IPv6 Konnektivität aktivieren und 10 Minuten warten. [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/zuhause-im-ipv6-web-surfen-teil2-windows' rel='bookmark' title='Zuhause im IPv6 Web surfen (Teil2: Windows)'>Zuhause im IPv6 Web surfen (Teil2: Windows)</a></li><li><a href='http://www.phpgangsta.de/zuhause-im-ipv6-web-surfen' rel='bookmark' title='Zuhause im IPv6 Web surfen (Teil1: Ubuntu)'>Zuhause im IPv6 Web surfen (Teil1: Ubuntu)</a></li></ol>]]></description> <content:encoded><![CDATA[<p><img class="alignright size-full wp-image-4136" title="IPv6 ready" src="http://www.phpgangsta.de/wp-content/uploads/ipv6-small.png" alt="" width="88" height="31" />So, damit es nicht heißt mein Blog wäre in 2011 nicht via <a href="http://www.phpgangsta.de/tag/ipv6" target="_blank">IPv6</a> erreichbar gewesen ist meine letzte Aktion dieses Jahr meinen Webserver via IPv6 erreichbar zu machen. Da mein Hoster nun auch endlich IPv6 für virtuelle Server anbietet war das ziemlich einfach: Man mußte im Kundenbereich die IPv6 Konnektivität aktivieren und 10 Minuten warten. Und schon war der Server via IPv6 erreichbar:</p><pre class="brush: bash; title: ; notranslate">$ ifconfig venet0 | grep inet6
inet6-Adresse: 2a01:238:42b6:2a00:e661:84eb:4a08:ee54/128 Gültigkeitsbereich:Global
inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine</pre><p>Dann mußte ich gerade noch den nginx neu kompilieren für die IPv6 Funktionalität (wurde eh mal wieder Zeit, war noch eine alte 0.8.53 Version), sodass ich nun die aktuelle 1.0.11 verwende:</p><p><span id="more-4119"></span></p><pre class="brush: bash; title: ; notranslate">$ wget http://nginx.org/download/nginx-1.0.11.tar.gz
$ tar -xzvf nginx-1.0.11.tar.gz
$ cd nginx-1.0.11
$ ./configure --with-http_ssl_module --without-http_memcached_module --with-http_gzip_static_module --with-ipv6
$ make
$ sudo make install
$ sudo /etc/init.d/nginx restart</pre><p>Und schon war die neue Version installiert, nun mit IPv6 Unterstützung:</p><pre class="brush: bash; title: ; notranslate">$ /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.0.11
built by gcc 4.4.5 (Debian 4.4.5-8)
TLS SNI support enabled
configure arguments: --with-http_ssl_module --without-http_memcached_module --with-http_gzip_static_module --with-ipv6</pre><p>Da ich in der nginx.conf aktuell nur eine server-Directive konfiguriert habe, da ich alles auf den dahinterliegenden Apache weiterleite, und bisher auf allen (sprich einer) IPv4 Adresse gelauscht habe kann ich das einfach ändern auf &#8220;alle IPv4+IPv6 Adressen&#8221;:</p><pre class="brush: plain; title: ; notranslate">listen [::]:80;</pre><p>Würde ich nur auf IPv6-Adressen lauschen wollen müßte ich den ipv6only Parameter nutzen:</p><pre class="brush: plain; title: ; notranslate">listen [::]:80 default ipv6only=on;</pre><p>Da ich nur eine öffentliche IPv6 Adresse habe (und auf localhost nicht lauschen möchte) könnte ich auch folgendes nehmen:</p><pre class="brush: plain; title: ; notranslate">listen [2a01:238:42b6:2a00:e661:84eb:4a08:ee54]:80;</pre><p>Nach einem erneuten Restart von nginx kann man nun meinen Server anpingen (vorausgesetzt man selbst hat IPv6 Verbindung zuhause, sonst natürlich nicht):</p><pre class="brush: bash; title: ; notranslate">$ ping6 2a01:238:42b6:2a00:e661:84eb:4a08:ee54
PING 2a01:238:42b6:2a00:e661:84eb:4a08:ee54(2a01:238:42b6:2a00:e661:84eb:4a08:ee54) 56 data bytes
64 bytes from 2a01:238:42b6:2a00:e661:84eb:4a08:ee54: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 2a01:238:42b6:2a00:e661:84eb:4a08:ee54: icmp_seq=2 ttl=64 time=0.068 ms</pre><p>So, was bleibt noch zu tun? Klar, DNS-Records anlegen. Für IPv6 sind das keine A Records sondern AAAA Records. Ich habe die folgenden angelegt:</p><pre class="brush: plain; title: ; notranslate">www.phpgangsta.de AAAA 2a01:238:42b6:2a00:e661:84eb:4a08:ee54
*.phpgangsta.de AAAA 2a01:238:42b6:2a00:e661:84eb:4a08:ee54
ipv6.phpgangsta.de AAAA 2a01:238:42b6:2a00:e661:84eb:4a08:ee54</pre><p>Damit ist die Domain incl. aller Subdomains nun auch via IPv6 erreichbar. Zur Überprüfung gibt es auch <a href="http://ipv6-test.com/validate.php" target="_blank">kleine Online Test Scripte</a> mit denen man schauen kann ob eine <a href="http://www.ip6test.com/server.php" target="_blank">Domain via IPv6</a> erreichbar ist. Ein weiteres <a href="http://www.subnetonline.com/pages/ipv6-network-tools/online-ipv6-ping.php" target="_blank">kleines Online-Tool für IPv6 Ping, Trace und Port Check</a>.</p><p><img class="alignnone size-full wp-image-4133" title="ipv6.phpgangsta.de" src="http://www.phpgangsta.de/wp-content/uploads/ipv6.phpgangsta.de_.png" alt="" width="722" height="749" /></p><h3>Mailserver:</h3><p>Da es so einfach und schnell ging habe ich auch noch schnell den Mailserver IPv6 ready gemacht. Dazu einfach die Postfix main.cf öffnen und folgende Zeilen ändern:</p><pre class="brush: plain; title: ; notranslate">inet_interfaces = all
inet_protocols = all</pre><p>Wer es nicht mag auf allen IP-Adressen zu lauschen kann sie natürlich auch auflisten:</p><pre class="brush: plain; title: ; notranslate">inet_interfaces = 127.0.0.1, 85.214.28.26, 2a01:238:42b6:2a00:e661:84eb:4a08:ee54, ::1
inet_protocols = ipv4, ipv6</pre><p>Danach den Postfix neustarten, fertig!</p><pre class="brush: plain; title: ; notranslate">telnet 2a01:238:42b6:2a00:e661:84eb:4a08:ee54 25</pre><p>Eingehende E-Mails können nun also auch über IPv6 empfangen werden. Hier sollte man dann darauf achten dass der DNS-MX-Eintrag richtig ist:</p><pre class="brush: bash; title: ; notranslate">$ dig -t MX phpgangsta.de +short
10 mail.phpgangsta.de.

$ dig -t AAAA mail.phpgangsta.de +short
2a01:238:42b6:2a00:e661:84eb:4a08:ee54</pre><p>Ob ausgehende E-Mails auch über IPv6 versendet werden kann man testen indem man eine E-Mail an autoreply@v6-mail.com schickt.</p><p>In /var/log/mail.log findet sich dann die folgende Zeile:</p><pre class="brush: plain; title: ; notranslate">Dec 31 02:20:51 h1440682 postfix/smtp[8177]: 68FB149CC961: to=&lt;autoreply@v6-mail.com&gt;,
relay=v6-mail.com[2001:470:18:16c::2]:25, delay=3, delays=1/0.01/1.2/0.67, dsn=2.0.0,
status=sent (250 2.0.0 Ok: queued as 9C566E401E0)</pre><h3>Fallstricke, Achtung!</h3><p>Wenn man IPv6 aktiviert sollte man natürlich über ein paar Dinge nachdenken. Beispielsweise wie die (PHP-) Applikationen mit IPv6 klarkommen, denn in $_SERVER['REMOTE_ADDR'] steht plötzlich eine IPv6 Adresse drin. Auch beim Mailserver muss man aufpassen falls man sich bisher auf IP-Blacklists (sogenannte DNSBLs) verlassen hat, bei IPv6 gibt es die nicht.</p><p>Falls man Firewall Regeln definiert hat müssen diese für IPv6 natürlich auch gemacht werden&#8230;</p><p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p><p>Wie weit seid ihr privat und auf der Arbeit mit IPv6? Sind eure Blogs, Firmenwebserver etc. schon via IPv6 erreichbar?</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/zuhause-im-ipv6-web-surfen-teil2-windows' rel='bookmark' title='Zuhause im IPv6 Web surfen (Teil2: Windows)'>Zuhause im IPv6 Web surfen (Teil2: Windows)</a></li><li><a href='http://www.phpgangsta.de/zuhause-im-ipv6-web-surfen' rel='bookmark' title='Zuhause im IPv6 Web surfen (Teil1: Ubuntu)'>Zuhause im IPv6 Web surfen (Teil1: Ubuntu)</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/letzte-aktion-in-2011-server-via-ipv6-verfugbar-machen/feed</wfw:commentRss> <slash:comments>4</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>Frohe Weihnachten!</title><link>http://www.phpgangsta.de/frohe-weihnachten</link> <comments>http://www.phpgangsta.de/frohe-weihnachten#comments</comments> <pubDate>Sat, 24 Dec 2011 12:53:41 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[Frohe Weihnacht]]></category> <category><![CDATA[Weihnachten]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4106</guid> <description><![CDATA[Ich wünsche euch allen frohe Weihnachten, lasst euch reich beschenken, vergebt euren Eltern wenn sie wieder peinliche Situationen herbeiführen, und verzeiht es euren Omas wenn sie zu euch den altbekannten Satz &#8220;Junge, bist du aber groß geworden&#8221; sagen. Ich wünsche euch noch keinen guten Rutsch denn hier im Blog wird es zwischen den Feiertagen noch [...]<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/elephpanten-zu-weihnachten-und-mayflower-adventskalender' rel='bookmark' title='ElePHPanten zu Weihnachten und Mayflower Adventskalender'>ElePHPanten zu Weihnachten und Mayflower Adventskalender</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Ich wünsche euch allen frohe Weihnachten, lasst euch reich beschenken, vergebt euren Eltern wenn sie wieder peinliche Situationen herbeiführen, und verzeiht es euren Omas wenn sie zu euch den altbekannten Satz &#8220;Junge, bist du aber groß geworden&#8221; sagen.</p><p>Ich wünsche euch <strong>noch keinen</strong> guten Rutsch denn hier im Blog wird es zwischen den Feiertagen noch einige Artikel geben.</p><p>In diesem Sinne&#8230;</p><p>Michael</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/elephpanten-zu-weihnachten-und-mayflower-adventskalender' rel='bookmark' title='ElePHPanten zu Weihnachten und Mayflower Adventskalender'>ElePHPanten zu Weihnachten und Mayflower Adventskalender</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/frohe-weihnachten/feed</wfw:commentRss> <slash:comments>1</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>Weihnachtsgewinnspiel bei antwerpes: Arduino zu gewinnen</title><link>http://www.phpgangsta.de/weihnachtsgewinnspiel-bei-antwerpes-arduino-zu-gewinnen</link> <comments>http://www.phpgangsta.de/weihnachtsgewinnspiel-bei-antwerpes-arduino-zu-gewinnen#comments</comments> <pubDate>Wed, 07 Dec 2011 10:34:43 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Allgemein]]></category> <category><![CDATA[antwerpes]]></category> <category><![CDATA[Arduino]]></category> <category><![CDATA[Gewinnspiel]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=4040</guid> <description><![CDATA[Kurzmeldung heute: Auch dieses Jahr gibt es wieder eine kleine Weihnachts-Programmieraufgabe für euch im antwerpes Blog: Ihr sollt ein kleines ASCII-Art-Bildchen erstellen! Wirklich eine machbare Sache, ihr könnt jede Programmiersprache benutzen, und es winken tolle Preise, unter anderem ein Arduino UNO Starterkit! Je ausgefallener die Lösung, umso höher die Chancen zu gewinnen! Lasst also euer [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/gewinnspiel-bei-antwerpes' rel='bookmark' title='Gewinnspiel bei antwerpes'>Gewinnspiel bei antwerpes</a></li><li><a href='http://www.phpgangsta.de/php-magazin-jahresabos-zu-gewinnen' rel='bookmark' title='PHP Magazin Jahresabos zu gewinnen'>PHP Magazin Jahresabos zu gewinnen</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Kurzmeldung heute: Auch dieses Jahr gibt es wieder eine kleine <a href="http://antwerpes.it/weihnachtsgewinnspiel-2011/2011/12/" target="_blank">Weihnachts-Programmieraufgabe für euch im antwerpes Blog</a>: Ihr sollt ein kleines ASCII-Art-Bildchen erstellen!</p><p>Wirklich eine machbare Sache, ihr könnt jede Programmiersprache benutzen, und es winken tolle Preise, unter anderem ein Arduino UNO Starterkit! Je ausgefallener die Lösung, umso höher die Chancen zu gewinnen!</p><p>Lasst also euer krankes Hirn mal auf die Aufgabe los und erstellt eine unglaubliche Lösung!</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/gewinnspiel-bei-antwerpes' rel='bookmark' title='Gewinnspiel bei antwerpes'>Gewinnspiel bei antwerpes</a></li><li><a href='http://www.phpgangsta.de/php-magazin-jahresabos-zu-gewinnen' rel='bookmark' title='PHP Magazin Jahresabos zu gewinnen'>PHP Magazin Jahresabos zu gewinnen</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/weihnachtsgewinnspiel-bei-antwerpes-arduino-zu-gewinnen/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>Das POP3 Protokoll im Detail betrachtet</title><link>http://www.phpgangsta.de/das-pop3-protokoll-im-detail-betrachtet</link> <comments>http://www.phpgangsta.de/das-pop3-protokoll-im-detail-betrachtet#comments</comments> <pubDate>Mon, 28 Nov 2011 08:53:20 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[Authentifizierung]]></category> <category><![CDATA[Kommandos]]></category> <category><![CDATA[POP3]]></category> <category><![CDATA[POP3 Commands]]></category> <category><![CDATA[POP3 Telnet]]></category> <category><![CDATA[Protokoll]]></category> <category><![CDATA[Telnet]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3970</guid> <description><![CDATA[Nachdem ich bereits das IMAP Protokoll und auch das SMTP Protokoll unter die Lupe genommen habe, möchte ich heute das POP3 Protokoll untersuchen und zeigen welche Befehle es gibt und wie man damit E-Mails von einem Mail-Server lesen kann. POP3 ist genauso wie IMAP ein Protokoll zum Abholen von E-Mails mit einem Mailclient wie zum [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/das-imap-protokoll-im-detail-betrachtet' rel='bookmark' title='Das IMAP Protokoll im Detail betrachtet'>Das IMAP Protokoll im Detail betrachtet</a></li><li><a href='http://www.phpgangsta.de/das-smtp-protokoll-im-detail-betrachtet' rel='bookmark' title='Das SMTP Protokoll im Detail betrachtet'>Das SMTP Protokoll im Detail betrachtet</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Nachdem ich bereits das <a href="http://www.phpgangsta.de/das-imap-protokoll-im-detail-betrachtet" target="_blank">IMAP Protokoll</a> und auch das <a href="http://www.phpgangsta.de/das-smtp-protokoll-im-detail-betrachtet" target="_blank">SMTP Protokoll</a> unter die Lupe genommen habe, möchte ich heute das POP3 Protokoll untersuchen und zeigen welche Befehle es gibt und wie man damit E-Mails von einem Mail-Server lesen kann. POP3 ist genauso wie IMAP ein Protokoll zum Abholen von E-Mails mit einem Mailclient wie zum Beispiel Outlook, Thunderbird etc.</p><p>Zuerst müssen wir uns zum Server verbinden, das geht entweder unverschlüsselt oder verschlüsselt mittels TLS oder SSL. Hier die verschiedenen Wege:</p><p><span id="more-3970"></span></p><pre class="brush: plain; title: ; notranslate">telnet pop3.phpgangsta.de 110
Trying 85.214.28.26...
Connected to pop3.phpgangsta.de.
Escape character is '^]'.
+OK Dovecot ready.</pre><p>Verschlüsselt mit TLS sieht das so aus:</p><pre class="brush: plain; title: ; notranslate">openssl s_client -crlf -connect pop3.phpgangsta.de:110 -starttls pop3
CONNECTED(00000003)
depth=0 O = Dovecot mail server, OU = h1440682., CN = h1440682.stratoserver.net, emailAddress = root@hwn53662
verify error:num=18:self signed certificate
verify return:1
depth=0 O = Dovecot mail server, OU = h1440682., CN = h1440682.stratoserver.net, emailAddress = root@hwn53662
verify error:num=10:certificate has expired
notAfter=Dec  4 21:15:04 2009 GMT
verify return:1
depth=0 O = Dovecot mail server, OU = h1440682., CN = h1440682.stratoserver.net, emailAddress = root@hwn53662
notAfter=Dec  4 21:15:04 2009 GMT
verify return:1
---
Certificate chain
0 s:/O=Dovecot mail server/OU=h1440682./CN=h1440682.stratoserver.net/emailAddress=root@hwn53662
i:/O=Dovecot mail server/OU=h1440682./CN=h1440682.stratoserver.net/emailAddress=root@hwn53662
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDQDCCAqmgAwIBAgIJAPqlHcMGI8LLMA0GCSqGSIb3DQEBBQUAMHQxHDAaBgNV
BAoTE0RvdmVjb3QgbWFpbCBzZXJ2ZXIxEjAQBgNVBAsTCWgxNDQwNjgyLjEiMCAG
A1UEAxMZaDE0NDA2ODIuc3RyYXRvc2VydmVyLm5ldDEcMBoGCSqGSIb3DQEJARYN

...

---
+OK Dovecot ready.</pre><p>Und schliesslich verschlüsselt mit SSL über den Port 995:</p><pre class="brush: plain; title: ; notranslate">openssl s_client -connect pop3.phpgangsta.de:995
CONNECTED(00000003)
depth=0 O = Dovecot mail server, OU = h1440682., CN = h1440682.stratoserver.net, emailAddress = root@hwn53662
verify error:num=18:self signed certificate
verify return:1
depth=0 O = Dovecot mail server, OU = h1440682., CN = h1440682.stratoserver.net, emailAddress = root@hwn53662
verify error:num=10:certificate has expired
notAfter=Dec  4 21:15:04 2009 GMT
verify return:1
depth=0 O = Dovecot mail server, OU = h1440682., CN = h1440682.stratoserver.net, emailAddress = root@hwn53662
notAfter=Dec  4 21:15:04 2009 GMT
verify return:1
---
Certificate chain
0 s:/O=Dovecot mail server/OU=h1440682./CN=h1440682.stratoserver.net/emailAddress=root@hwn53662
i:/O=Dovecot mail server/OU=h1440682./CN=h1440682.stratoserver.net/emailAddress=root@hwn53662
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDQDCCAqmgAwIBAgIJAPqlHcMGI8LLMA0GCSqGSIb3DQEBBQUAMHQxHDAaBgNV
BAoTE0RvdmVjb3QgbWFpbCBzZXJ2ZXIxEjAQBgNVBAsTCWgxNDQwNjgyLjEiMCAG
A1UEAxMZaDE0NDA2ODIuc3RyYXRvc2VydmVyLm5ldDEcMBoGCSqGSIb3DQEJARYN

...

---
+OK Dovecot ready.</pre><p>Gut, die Verbindung steht, nun müssen wir uns authentifizieren. Dazu gibt es verschiedene Möglichkeiten, hier die einfachste:</p><pre class="brush: plain; title: ; notranslate">USER xxxx@phpgangsta.de
+OK
PASS SicheresPasswort
+OK Logged in.</pre><p>Der Loginname und das Passwort werden einzeln um im Klartext an den Server geschickt. Solange TLS oder SSL bereits aktiviert sind ist das kein Sicherheitsproblem, sollte allerdings keine Verschlüsselung aktiviert sein sollte man für die Authentifizierung besser APOP nutzen (auch wenn das nicht 100% sicher ist):</p><p>http://de.wikipedia.org/wiki/APOP</p><pre class="brush: plain; title: ; notranslate">+OK POP3 server ready &lt;1896.697170952@phpgangsta.de&gt;
APOP xxx@phpgangsta.de c4c9334bac560ecc979e58001b3e22fb
+OK Logged in.</pre><p>Der zweite Parameter ist ein MD5-Hash, der aus dem Zeitstempel ( &lt;process-ID.timestamp@hostname&gt; ) und dem Klartextkennwort gebildet wird. Dies kann der Server dann überprüfen und den Login zulassen oder nicht.</p><p>Nach dem Login möchten wir wahrscheinlich eine Liste aller E-Mails haben. Eine vollständige Liste aller Nachrichtennummern und Größen gibt es mit dem Befehl</p><pre class="brush: plain; title: ; notranslate">LIST
+OK 7 messages:
1 1737
2 2333
3 1984
4 1788
5 4094
6 2693
7 2279
.</pre><p>Nur die Größe der 5. Nachricht fragt man so ab:</p><pre class="brush: plain; title: ; notranslate">LIST 5
+OK 5 4094</pre><p>Möchten wir nun eine E-Mail abrufen holen wir wie folgt die komplette 1. Nachricht:</p><pre class="brush: plain; title: ; notranslate">RETR 1
+OK 1737 octets
Return-Path: &lt;XXXX@domain.de&gt;
Delivered-To: xxx@phpgangsta.de
Received: from localhost (h1440682.stratoserver.net [127.0.0.1])
by h1440682.stratoserver.net (Postfix) with ESMTP id 0EBBAEC9A8F
for &lt;xxx@phpgangsta.de&gt;; Sun, 29 Nov 2009 11:14:26 +0000 (UTC)
Message-ID: &lt;4B125783.9050508@gmx.de&gt;
Date: Sun, 29 Nov 2009 12:14:11 +0100
From: Michael Kliewe &lt;XXXX@domain.de&gt;
User-Agent: Thunderbird 2.0.0.23 (Windows/20090812)
MIME-Version: 1.0
To: xxx@phpgangsta.de
Subject: test neues Konto
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

das sollte ankommen
.</pre><p>Wir können auch nur die Header abfragen:</p><pre class="brush: plain; title: ; notranslate">TOP 1 0
+OK
Return-Path: &lt;XXXX@domain.de&gt;
Delivered-To: xxx@phpgangsta.de
Received: from localhost (h1440682.stratoserver.net [127.0.0.1])
by h1440682.stratoserver.net (Postfix) with ESMTP id 0EBBAEC9A8F
for &lt;xxx@phpgangsta.de&gt;; Sun, 29 Nov 2009 11:14:26 +0000 (UTC)
Message-ID: &lt;4B125783.9050508@gmx.de&gt;
Date: Sun, 29 Nov 2009 12:14:11 +0100
From: Michael Kliewe &lt;XXXX@domain.de&gt;
User-Agent: Thunderbird 2.0.0.23 (Windows/20090812)
MIME-Version: 1.0
To: xxx@phpgangsta.de
Subject: test neues Konto
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

.</pre><p>Mit &#8220;TOP 1 10&#8243; könnten wir uns die Header plus die ersten 10 Zeilen der E-Mail geben lassen.</p><p>Möchten wir eine E-Mail löschen (weil wir sie gelesen bzw. heruntergeladen haben) markieren wir sie zur Löschung:</p><pre class="brush: plain; title: ; notranslate">DELE 1
+OK Marked to be deleted.</pre><p>Fragen wir nun erneut die Liste aller vorhandenen E-Mails ab erhalten wir:</p><pre class="brush: plain; title: ; notranslate">LIST
+OK 6 messages:
2 2333
3 1984
4 1788
5 4094
6 2693
7 2279
.</pre><p>Die erste Nachricht fehlt (wir haben sie ja zum Löschen markiert), aber bemerkenswert ist dass die fortlaufende Nummerierung nicht wiederhergestellt wurde, es gibt nun also eine Lücke. Sobald man sich ausloggt wird die zum Löschen markierte E-Mail wirklich gelöscht. Wenn man das nicht möchte und sie wiedergestellen möchte hilft ein Reset der Markierungen:</p><pre class="brush: plain; title: ; notranslate">RSET
+OK</pre><p>Möchte man eine eindeutige Kennung herausfinden geht das mit dem UIDL Kommando:</p><pre class="brush: plain; title: ; notranslate">UIDL 6
+OK 6 UID21-1259493142</pre><p>Eine vollständige Liste alle UIDs erhält man mittels</p><pre class="brush: plain; title: ; notranslate">UIDL
+OK
1 UID3-1259493142
2 UID4-1259493142
3 UID5-1259493142
4 UID7-1259493142
5 UID20-1259493142
6 UID21-1259493142
7 UID84-1259493142
.</pre><p>Wenn die Verbindung aufrecht erhalten werden soll müssen wir etwas gegen den drohenden Timeout machen, wir senden periodisch ein NOOP um dem Server zu sagen dass wir noch da sind:</p><pre class="brush: plain; title: ; notranslate">NOOP
+OK</pre><p>Ein kurzer Befehl um den aktuellen Status anzeigen zu lassen:</p><pre class="brush: plain; title: ; notranslate">STAT
+OK 7 16573</pre><p>Damit könnte man beispielsweise schnell prüfen ob neue E-Mails dazugekommen sind usw.</p><p>Soll die Verbindung getrennt werden loggen wir uns aus:</p><pre class="brush: plain; title: ; notranslate">QUIT
+OK Logging out, messages deleted.
Connection closed by foreign host.</pre><p>Tja, das war es schon wieder, POP3 ist ziemlich einfach, es gibt keine Ordner oder Flags wie in IMAP, deshalb ist die Kommandoübersicht recht kurz. Bis auf einige Sonderfälle sollte immer IMAP verwendet werden, dann kann man mit Ordner und Flags arbeiten, Dank IMAP IDLE kommen E-Mails in Echtzeit an usw.</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/das-imap-protokoll-im-detail-betrachtet' rel='bookmark' title='Das IMAP Protokoll im Detail betrachtet'>Das IMAP Protokoll im Detail betrachtet</a></li><li><a href='http://www.phpgangsta.de/das-smtp-protokoll-im-detail-betrachtet' rel='bookmark' title='Das SMTP Protokoll im Detail betrachtet'>Das SMTP Protokoll im Detail betrachtet</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/das-pop3-protokoll-im-detail-betrachtet/feed</wfw:commentRss> <slash:comments>0</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> </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 using disk: basic
Object Caching 5771/6021 objects using disk: basic

Served from: www.phpgangsta.de @ 2012-02-04 12:26:58 -->
