Archive for 2010
Der Unterschied zwischen fsockopen() und stream_socket_client()
Oft findet man in seinem Code (oder den benutzten Libraries wie beispielsweise Zend Framework) die Funktion fsockopen(). Daran ist auch eigentlich nichts verwerfliches, sie ist seit PHP 4 verfügbar und tut im Prinzip das selbe wie stream_socket_client(): Sie baut eine Socket-Verbindung zu einem entfernten Server auf, beispielsweise zu einem Webserver:
$socket = @fsockopen('ssl://www.example.org' , 443 , $errno , $errstr , 30);
fsockopen() versteht also auch SSL wie man oben sieht. Man kann nun ganz normal fread(), fwrite() und fclose() verwenden.
Wo ist nun also der Vorteil von der seit PHP5 verfügbaren Funktion stream_socket_client()?
Nehmen wir an unser Server besitzt mehrere IP-Adressen. fsockopen() kann man nicht beibringen welche der IP-Adressen es nutzen soll um die ausgehende Verbindung aufzubauen. Mit stream_socket_client() geht das wie folgt:
$socket_options = array('socket' => array('bindto' => '192.0.2.1:0')); $socket_context = stream_context_create($socket_options); $socket = stream_socket_client('ssl://www.example.org:443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $socket_context);
Ein weiterer Pluspunkt sind die vielfältigen Optionen bei der SSL Verbindung. Beispielsweise kann man die Überprüfung des Zertifikats aktivieren, selbst signierte Zertifikate erlauben oder auch nicht, den Pfad zum CA-File festlegen und einiges mehr.
$socket_options = array('ssl' => array('verify_peer' => true, 'allow_self_signed' => true));
Es gibt auch eine Menge Optionen für die HTTP(s) Verbindungen. Man kann den User Agent ändern, einen Proxy-Server definieren, als Protokoll-Version entweder 1.0 oder 1.1 verwenden etc.
$socket_options = array('http' => array('user_agent' => 'Mein UA', 'protocol_version' => '1.1'));
Ich suche noch die Nachteile von stream_socket_client, bisher habe ich keine gefunden. Beide beherrschen den non-blocking Modus, mit beiden kann man auch permanente Verbindungen aufbauen, die wiederverwendet werden falls man kurze Zeit später nochmal genau die selbe Verbindung aufbaut, und stream_socket_client() bietet noch viele weitere Stream-Funktionen, die fsockopen() häufig nicht unterstützt.
Wer von euch nutzt bevorzugt fsockopen und warum?
Slides der ZendCon 2010
Vom 1. bis zum 4. November fand dieses Jahr die ZendCon statt, eine der wohl größten und bedeutendsten internationalen Konferenzen. Mit über 70 Sessions wurde von hochkarätigen Speakern (die Namen muss man sich mal alle anschauen, phänomenal) der Tagesplan reich gefüllt und sicher war/ist für jeden etwas dabei.
Da ihr wahrscheinlich, wie ich auch, nicht teilgenommen habt, stelle ich hier die bisher verfügbaren Präsentationen zusammen, zum Nachlesen der aktuell wichtigen Themen aus dem PHP- und Webumfeld. Falls ihr weitere Präsentationen gefunden habt, gebt bitte Bescheid.
Montag – 1. November 2010
Taming the Untestable Beast
Sebastian Bergmann, Stefan Priebsch
http://www.slideshare.net/sebastian_bergmann/taming-the-untestable-beast
Zend PHP Certification Boot Camp
Christian Wenz
Part I
Cloudy with a Chance of PHP
Josh Holmes, Eli White, Travis Swicegood
http://eliw.com/presentations/zendcon2010/zend-Cloudy_with_a_Chance_of_PHP.pdf
Linkpool Nummer 11
Evercookie: Das Cookie, das der User nicht mehr los wird
http://samy.pl/evercookie/
Über PHP-Entwicklung für Android
http://www.developer.com/features/article.php/52691_3904261_1/Build-Your-First-PHP-for-Android-Application.htm
Kleines Javascript Spiel zum Zerschiessen von Webseiten, gegen die Langeweile zwischendurch
http://erkie.github.com/
Sehr ausführliche Auflistung von Beispielfragen für die Zend Zertifizierung
http://jagatk.wordpress.com/2010/09/27/zend-certification-php-5-sample-questions/
Warum der MySQL Timestamp vom PHP Timestamp abweicht trotz gleichem Systemdatum
http://blog.pumka.net/2010/10/24/why-mysql-timestamp-is-24-seconds-different-from-php/
Interessantes (meist rein theoretisches) Problem: Remote Timing Attacks
http://blog.astrumfutura.com/2010/10/nanosecond-scale-remote-timing-attacks-on-php-applications-time-to-take-them-seriously/
Webseiten Performance Analyse Tool
http://www.yottaa.com/
Über Background Prozesse und wie man PHP Scripte etwas ausbremst für eine bessere Systemperformance
http://www.phpclasses.org/blog/post/132-Accelerate-Page-Accesses-Throttling-Background-Tasks-Unusual-Site-Speedup-Techniques-Part-2.html
Speicherung der Session Daten in memcached mittels Zend_Cache_Backend_Libmemcached
http://blog.digitalstruct.com/2010/10/24/zend-framework-cache-backend-libmemcached-session-cache/
Test von Googles neuem Apache Modul mod_pagespeed
Google kündigt an, die Welt applaudiert: Das neue Apache-Modul mod_pagespeed soll automatisch Webseiten schneller machen, ohne Aufwand und für jede Seite, eine bis zu 50% schnellere Webseite wird versprochen. Google selbst hat natürlich auch etwas davon: Wenn jede Webseite schneller abrufbar ist, können die Suchmaschinen-Spider schneller und mehr crawlen…
Doch wenn man es selbst ausprobiert sind die Ergebnisse ernüchternd. Ich habe heute Abend das Modul installiert und aktiviert (in unter 3 Minuten), und ein paar Messergebnisse mit Firebug, PageSpeed und YSlow zusammengetragen.
Ergebnis: kein nennenswerter Geschwindigkeitsschub, teilweise sogar langsamer als vorher. Einige haben bei ersten Benchmarks das selbe Ergebnis wie ich erhalten, andere jedoch sprechen von 46% Verbesserung. Es scheint sehr davon abzuhängen wie die Seite aufgebaut ist und ob bereits Maßnahmen zur Verbesserung der Performance getroffen wurden.
Außerdem habe ich auf meiner Seite nach der Aktivierung Probleme mit dem HTML-Validator gefunden die vorher nicht da waren, durch die „Verbesserungen“ habe ich plötzlich ungültigen HTML-Code!
Hat jemand von Euch bereits Tests gemacht, was ist dabei herausgekommen?
==========================
Die Installation unter Ubuntu (32bit) ist denkbar einfach:
Weiterlesen »
Heute ist „Developers Shame Day“!
Der bereits angekündigte Developers Shame Day ist (bzw. war) heute, und ich habe mal in meinen alten Dateien gewühlt, und etwas „tolles“ gefunden. Getreu unter dem Motto „mit schlechtem Beispiel voran“. Weiter unten findet ihr auch weitere Beiträge von anderen Bloggern.
$result = mysql_query("UPDATE files SET Caption = REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(Caption, 'Ä', 'Ae'), 'Ö', 'Oe'), 'Ü', 'Ue'), 'ä', 'ae'), 'ö', 'oe'), 'ü','ue'), 'ß', 'ss')");
<script><!-- CSInit = new Array; function CSScriptInit() { if(typeof(skipPage) != "undefined") { if(skipPage) return; } idxArray = new Array; for(var i=0;i<CSInit.length;i++) idxArray[i] = i; CSAction2(CSInit, idxArray);} CSAg = window.navigator.userAgent; CSBVers = parseInt(CSAg.charAt(CSAg.indexOf("/")+1),10); CSIsW3CDOM = ((document.getElementById) && !(IsIE()&&CSBVers<6)) ? true : false; function IsIE() { return CSAg.indexOf("MSIE") > 0;} function CSIEStyl(s) { return document.all.tags("div")[s].style; } function CSNSStyl(s) { if (CSIsW3CDOM) return document.getElementById(s).style; else return CSFindElement(s,0); } CSIImg=false; function CSInitImgID() {if (!CSIImg && document.images) { for (var i=0; i<document.images.length; i++) { if (!document.images[i].id) document.images[i].id=document.images[i].name; } CSIImg = true;}} function CSFindElement(n,ly) { if (CSBVers<4) return document[n]; if (CSIsW3CDOM) {CSInitImgID();return(document.getElementById(n));} var curDoc = ly?ly.document:document; var elem = curDoc[n]; if (!elem) {for (var i=0;i<curDoc.layers.length;i++) {elem=CSFindElement(n,curDoc.layers[i]); if (elem) return elem; }} return elem; } function CSGetImage(n) {if(document.images) {return ((!IsIE()&&CSBVers<5)?CSFindElement(n,0):document.images[n]);} else {return null;}} CSDInit=false; function CSIDOM() { if (CSDInit)return; CSDInit=true; if(document.getElementsByTagName) {var n = document.getElementsByTagName('DIV'); for (var i=0;i<n.length;i++) {CSICSS2Prop(n[i].id);}}} function CSICSS2Prop(id) { var n = document.getElementsByTagName('STYLE');for (var i=0;i<n.length;i++) { var cn = n[i].childNodes; for (var j=0;j<cn.length;j++) { CSSetCSS2Props(CSFetchStyle(cn[j].data, id),id); }}} function CSFetchStyle(sc, id) { var s=sc; while(s.indexOf("#")!=-1) { s=s.substring(s.indexOf("#")+1,sc.length); if (s.substring(0,s.indexOf("{")).toUpperCase().indexOf(id.toUpperCase())!=-1) return(s.substring(s.indexOf("{")+1,s.indexOf("}")));} return ""; }
Hier die index.php eines alten Projekts: