(PHP 4, PHP 5, PHP 7, PHP 8)
fsockopen — Stellt eine Internet- oder Unix-Domain-Socket-Verbindung her
$hostname
,$port
= -1,&$error_code
= null
,&$error_message
= null
,$timeout
= null
Initialisiert eine Socket-Verbindung zu der in
hostname
angegebenen Ressource.
PHP unterstützt Ziele in Internet- und Unixdomänen, wie sie unter Liste der unterstützten Socket-Transporter beschrieben sind. Eine Liste unterstützter Transportarten kann auch mittels stream_get_transports() abgerufen werden.
Der Socket wird standardmäßig im blockierenden Modus geöffnet. Mit der Funktion stream_set_blocking() kann auf den nichtblockierenden Modus gewechselt werden.
Die Funktion stream_socket_client() ist ähnlich, bietet aber eine umfangreichere Auswahl von Optionen an, einschließlich blockierungsfreier Verbindungen und der Möglichkeit, einen Stream-Kontext zu übergeben.
hostname
Ist die OpenSSL-Unterstützung
installiert, kann dem
Parameter hostname
entweder ein
ssl://
oder ein tls://
vorangestellt werden, um bei der Verbindung zum entfernten Host eine
SSL- oder TLS-Clientverbindung über TCP/IP zu verwenden.
port
Die Portnummer. Diese kann ausgelassen und mit -1
übersprungen werden, wenn der Transport keinen Port verwendet, z. B.
unix://
.
error_code
Falls angegeben, enthält der Parameter die Fehlernummer auf
Systemebene, die beim Aufruf der Funktion connect()
auftrat.
Wenn der Rückgabewert von error_code
0
ist und die Funktion false
zurückgibt, ist dies
ein Zeichen, dass der Fehler vor dem Aufruf von
connect()
auftrat. Dies ist meist der Fall,
wenn es ein Problem beim Initialisieren des Sockets gibt.
error_message
Die Fehlermeldung als String.
timeout
Der Verbindungs-Timeout in Sekunden. Falls null
, wird die
php.ini-Einstellung
default_socket_timeout
verwendet.
Hinweis:
Um einen Timeout für das Lesen oder Schreiben von Daten über den Socket zu setzen, muss stream_set_timeout() verwendet werden, da der Parameter
timeout
von fsockopen() nur für den Verbindungsaufbau mit dem Socket gedacht ist.
Die Funktion fsockopen() gibt einen Zeiger auf eine
Datei zurück, der zusammen mit den anderen Dateifunktionen (wie
fgets(), fgetss(),
fwrite(), fclose() und
feof()) verwendet werden kann. Wenn der Aufruf
fehlschlägt, wird false
zurückgegeben.
Löst einen Fehler der Stufe E_WARNING
aus, wenn
hostname
keine gültige Domain ist.
Version | Beschreibung |
---|---|
8.0.0 |
timeout ist nun nullable (akzeptiert den
null -Wert).
|
Beispiel #1 fsockopen()-Beispiel
<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
Beispiel #2 Eine UDP-Verbindung nutzen
Das folgende Beispiel zeigt, wie Sie den Tag und die Zeit vom UDP-Service "daytime" (Port 13) Ihrer Maschine abfragen können.
<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 26);
fclose($fp);
}
?>
Hinweis:
Abhängig von der Systemumgebung kann es vorkommen, dass die Unix-Domäne oder der optionale Verbindungs-Timeout nicht verfügbar sind.
UDP-Sockets werden manchmal ohne die Rückgabe eines Fehlermeldung geöffnet, obwohl der entfernte Host nicht erreichbar ist. Der Fehler wird nur sichtbar, wenn Sie Daten vom Socket lesen oder zum Socket schreiben wollen. Der Grund dafür ist, dass UDP ein "verbindungsloses" Protokoll ist, was bedeutet, dass das Betriebssystem nicht versucht, eine Verbindung zum Socket herzustellen, solange es nicht wirklich Daten senden oder empfangen muss.
Hinweis: Wenn Sie eine numerische IPv6-Adresse angeben, z. B.
fe80::1
, müssen Sie die IP in eckige Klammern schreiben, z. B.tcp://[fe80::1]:80
.