PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘stream_socket_client’ tag

Der Unterschied zwischen fsockopen() und stream_socket_client()

with one comment

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?

Written by Michael Kliewe

November 26th, 2010 at 10:07 am

Posted in PHP

Tagged with , ,