Start · Sprachen · PHP · Referenz · socket_clear_error

socket_clear_error

Funktion

Löscht den gespeicherten Fehlercode eines Socket-Objekts oder, wenn kein Socket angegeben wird, den globalen Socket-Fehlercode.

seit PHP 4.3.0 Kategorie: http

Signatur

socket_clear_error(?Socket $socket = null): void

Beschreibung

socket_clear_error() setzt den Fehlercode eines übergebenen Socket-Objekts auf null zurück. Wird kein Socket übergeben (oder null), wird stattdessen der globale, prozessweite Socket-Fehlercode gelöscht, der von socket_last_error() ohne Argument zurückgegeben wird.

Die Funktion ist vor allem dann nützlich, wenn man nach einem abgefangenen Fehler sicherstellen möchte, dass folgende Aufrufe von socket_last_error() nicht noch den alten Fehlercode liefern. Ohne dieses Zurücksetzen bleibt der Fehlerwert solange erhalten, bis ein neuer Fehler auftritt oder die Verbindung getrennt wird.

Typischer Einsatz: Nach dem Behandeln eines EAGAIN- oder EWOULDBLOCK-Fehlers (Socket ist nicht-blockierend, Daten noch nicht verfügbar) den Fehlerpuffer bereinigen, bevor erneut gelesene oder geschrieben wird.

Parameter

Name Typ Default Beschreibung
$socket ?Socket null Das Socket-Objekt, dessen Fehlerpuffer geleert werden soll. Wird null übergeben oder der Parameter weggelassen, wird der globale Socket-Fehlerpuffer des Prozesses geleert.

Rückgabewert

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

Beispiele

Fehlerpuffer nach EAGAIN im nicht-blockierenden Modus zurücksetzen

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);

// Verbindungsversuch – bei nicht-blockierendem Socket sofort
@socket_connect($socket, '127.0.0.1', 8080);

$error = socket_last_error($socket);

if ($error === SOCKET_EINPROGRESS || $error === SOCKET_EWOULDBLOCK) {
    echo 'Verbindung wird hergestellt (nicht-blockierend)...' . PHP_EOL;
    // Fehler wurde behandelt, Puffer leeren
    socket_clear_error($socket);
}

// Weiterer Betrieb — socket_last_error() liefert jetzt 0
echo 'Aktueller Fehlercode: ' . socket_last_error($socket) . PHP_EOL;

socket_close($socket);
Verbindung wird hergestellt (nicht-blockierend)... Aktueller Fehlercode: 0

Globalen Socket-Fehlerpuffer leeren (ohne Socket-Objekt)

<?php
// Simulierter globaler Fehler durch eine fehlgeschlagene Operation
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Absichtlich ungültige Verbindung
@socket_connect($socket, '0.0.0.0', 0);

echo 'Fehler vor dem Löschen: ' . socket_last_error() . PHP_EOL;

// Globalen Fehlerpuffer leeren
socket_clear_error();

echo 'Fehler nach dem Löschen: ' . socket_last_error() . PHP_EOL;

socket_close($socket);
Fehler vor dem Löschen: 111 Fehler nach dem Löschen: 0

// Wichtig · Fallstricke

Hinweis zu PHP 8.0: Ab PHP 8.0 wird das ressource-basierte Socket-Handle durch das Socket-Objekt ersetzt. In älteren PHP-Versionen (5.x / 7.x) wird statt eines Socket-Objekts eine Ressource übergeben.

Fallstrick: Das Löschen des globalen Fehlerpuffers beeinflusst alle Teile des Programms, die socket_last_error() ohne Argument aufrufen. In Multi-Socket-Szenarien sollte daher immer das konkrete Socket-Objekt übergeben werden, um unerwünschte Seiteneffekte zu vermeiden.