Start · Sprachen · PHP · Referenz · socket_wsaprotocol_info_release

socket_wsaprotocol_info_release

Funktion

Gibt eine zuvor exportierte <code>WSAPROTOCOL_INFO</code>-Struktur frei, die für die prozessübergreifende Socket-Weitergabe unter Windows verwendet wurde.

seit PHP 7.3.0 Kategorie: http

Signatur

socket_wsaprotocol_info_release(string $info_id): bool

Beschreibung

socket_wsaprotocol_info_release() gehört zur Windows-spezifischen WSA-API (Windows Sockets API) und dient dazu, eine exportierte WSAPROTOCOL_INFO-Struktur freizugeben, die zuvor mit socket_wsaprotocol_info_export() erzeugt wurde. Nachdem ein Socket via socket_wsaprotocol_info_import() in einem anderen Prozess importiert wurde, muss die dazugehörige Struktur explizit wieder freigegeben werden, um Speicherlecks zu vermeiden.

Diese Funktion ist ausschließlich auf Windows-Systemen verfügbar und hat keinen Effekt auf anderen Betriebssystemen. Sie wird typischerweise in Szenarien eingesetzt, in denen ein HTTP-Server oder ein Daemon-Prozess einen bereits verbundenen Socket an einen Kind-Prozess (z. B. einen Worker) übergeben soll, ohne den Socket neu aufzubauen.

Der Parameter $info_id entspricht dem eindeutigen Bezeichner, den socket_wsaprotocol_info_export() beim Export zurückgeliefert hat. Nach dem Aufruf von socket_wsaprotocol_info_release() ist dieser Bezeichner ungültig und darf nicht mehr für einen Import verwendet werden.

Parameter

Name Typ Default Beschreibung
$info_id Pflicht string Der eindeutige Bezeichner (ID) der exportierten WSAPROTOCOL_INFO-Struktur, wie er von socket_wsaprotocol_info_export() zurückgegeben wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Struktur erfolgreich freigegeben wurde, oder false im Fehlerfall (z. B. wenn die angegebene ID ungültig oder bereits freigegeben ist).

Beispiele

Socket exportieren, importieren und Struktur freigeben

<?php
// Elternprozess: Socket erstellen und exportieren
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);

// Socket-Info exportieren – die ID wird an den Kindprozess übergeben
$info_id = socket_wsaprotocol_info_export($socket, getmypid());

if ($info_id === false) {
    echo 'Export fehlgeschlagen: ' . socket_strerror(socket_last_error()) . PHP_EOL;
    exit(1);
}

echo 'Exportierte Info-ID: ' . $info_id . PHP_EOL;

// ... Kindprozess importiert den Socket via socket_wsaprotocol_info_import($info_id)
// Nachdem der Import abgeschlossen ist, Struktur im Elternprozess freigeben:
$result = socket_wsaprotocol_info_release($info_id);

if ($result) {
    echo 'WSAPROTOCOL_INFO-Struktur erfolgreich freigegeben.' . PHP_EOL;
} else {
    echo 'Fehler beim Freigeben: ' . socket_strerror(socket_last_error()) . PHP_EOL;
}

socket_close($socket);
Exportierte Info-ID: <eindeutige-ID> WSAPROTOCOL_INFO-Struktur erfolgreich freigegeben.

Fehlerbehandlung bei ungültiger ID

<?php
// Versuch, eine ungültige oder bereits freigegebene ID zu releasen
$ungueltige_id = 'nicht-vorhandene-id-12345';

$result = socket_wsaprotocol_info_release($ungueltige_id);

if ($result === false) {
    $fehlercode = socket_last_error();
    echo 'Freigabe fehlgeschlagen. Fehlercode: ' . $fehlercode . PHP_EOL;
    echo 'Fehlermeldung: ' . socket_strerror($fehlercode) . PHP_EOL;
} else {
    echo 'Struktur freigegeben.' . PHP_EOL;
}
Freigabe fehlgeschlagen. Fehlercode: <Fehlercode> Fehlermeldung: <Windows-Fehlermeldung>

// Wichtig · Fallstricke

Plattformabhängigkeit: Diese Funktion ist ausschließlich unter Windows verfügbar, da sie auf der Windows Sockets API (WSA) basiert. Auf Linux- oder macOS-Systemen existiert sie nicht. Für prozessübergreifende Socket-Weitergabe unter Unix-artigen Systemen sollten stattdessen Unix-Domain-Sockets mit socket_sendmsg() und SCM_RIGHTS verwendet werden.

Ressourcenverwaltung: Jede mit socket_wsaprotocol_info_export() erzeugte Struktur muss nach der Verwendung mit socket_wsaprotocol_info_release() explizit freigegeben werden. Eine fehlende Freigabe führt zu einem Speicher- bzw. Ressourcenleck im Windows-Kernel.

Reihenfolge beachten: Die Freigabe sollte erst erfolgen, nachdem der Importprozess den Socket vollständig übernommen hat, da sonst der Import fehlschlagen kann.