Start · Sprachen · PHP · Referenz · socket_close

socket_close

Funktion

Schließt eine zuvor geöffnete <code>Socket</code>-Instanz und gibt die zugehörigen Ressourcen frei.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_close(Socket $socket): void

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

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

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";
Antwort erhalten (... Bytes) Socket erfolgreich geschlossen.

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";
Server wartet auf Verbindungen auf Port 8080... Client-Verbindung geschlossen. Server-Socket geschlossen.

// 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.