Signatur
Beschreibung
socket_close() beendet eine Socket-Verbindung und gibt alle Systemressourcen frei, die mit der übergebenen Socket-Instanz verknüpft sind. Sie sollte immer dann aufgerufen werden, wenn ein Socket nicht mehr benötigt wird, um Ressourcenlecks zu vermeiden.
Die Funktion entspricht dem POSIX-Systemaufruf close(). Nach dem Aufruf ist die übergebene Socket-Instanz ungültig und darf nicht mehr für weitere Socket-Operationen verwendet werden. Jeglicher Versuch, den geschlossenen Socket weiterzuverwenden, führt zu einem Fehler.
Wichtig: Bei verbindungsorientierten Protokollen wie TCP sollte vor dem Schließen des Sockets socket_shutdown() aufgerufen werden, um die Verbindung ordnungsgemäß zu beenden und sicherzustellen, dass alle ausstehenden Daten noch übertragen werden. socket_close() allein sendet keinen FIN-Handshake und kann dazu führen, dass Daten verloren gehen.
Diese Funktion gehört zur Socket-Extension (ext/sockets) und erfordert, dass PHP mit --enable-sockets kompiliert oder die entsprechende Extension geladen wurde.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $socket Pflicht | Socket | Eine gültige Socket-Instanz, wie sie von socket_create(), socket_accept() oder ähnlichen Funktionen zurückgegeben wird. |
Rückgabewert
Beispiele
Einfacher TCP-Client mit korrektem Schließen
<?php
// Socket erstellen
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}
// Verbindung zu einem Server herstellen
$result = socket_connect($socket, '127.0.0.1', 80);
if ($result === false) {
die('socket_connect() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}
// HTTP-Anfrage senden
$request = "GET / HTTP/1.0\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Antwort lesen
$response = '';
while ($chunk = socket_read($socket, 1024)) {
$response .= $chunk;
}
echo "Antwort erhalten (", strlen($response), " Bytes)\n";
// Verbindung ordnungsgemäß beenden und Socket schließen
socket_shutdown($socket, 2);
socket_close($socket);
echo "Socket erfolgreich geschlossen.\n";
Einfacher TCP-Server mit socket_close
<?php
// Server-Socket erstellen
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($serverSocket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($serverSocket, '0.0.0.0', 8080);
socket_listen($serverSocket, 5);
echo "Server wartet auf Verbindungen auf Port 8080...\n";
// Eine einzelne Verbindung annehmen
$clientSocket = socket_accept($serverSocket);
if ($clientSocket !== false) {
// Nachricht an den Client senden
$message = "Hallo vom Server!\n";
socket_write($clientSocket, $message, strlen($message));
// Client-Socket ordnungsgemäß schließen
socket_shutdown($clientSocket, 2);
socket_close($clientSocket);
echo "Client-Verbindung geschlossen.\n";
}
// Server-Socket schließen
socket_close($serverSocket);
echo "Server-Socket geschlossen.\n";
// Wichtig · Fallstricke
Ressourcenverwaltung: Wird socket_close() nicht aufgerufen, bleiben Betriebssystem-Ressourcen (Dateideskriptoren) belegt, bis das PHP-Skript endet. Bei langlebigen Prozessen oder Servern kann das zu einer Erschöpfung der verfügbaren Dateideskriptoren führen.
Reihenfolge beim Schließen: Bei TCP-Verbindungen empfiehlt es sich, zuvor socket_shutdown() mit dem Modus 2 (beide Richtungen) aufzurufen, damit die Gegenseite die Verbindungsbeendigung korrekt erkennt und kein Datenverlust entsteht.
Seit PHP 8.0: Der Parameter ist vom Typ Socket (ein Objekt), zuvor wurde eine resource erwartet. Bestehender Code, der auf resource-Rückgabewerte von Socket-Funktionen prüft, muss angepasst werden.