Signatur
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
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);
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;
}
// 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.