Start · Sprachen · PHP · Referenz · readline_callback_handler_remove

readline_callback_handler_remove

Funktion

Entfernt den zuletzt registrierten Readline-Callback-Handler und setzt die Terminalumgebung auf ihren ursprünglichen Zustand zurück.

seit PHP 5.1.0 Kategorie: io

Signatur

readline_callback_handler_remove(): bool

Beschreibung

readline_callback_handler_remove() wird verwendet, um einen zuvor mit readline_callback_handler_install() registrierten Callback-Handler zu entfernen. Gleichzeitig stellt die Funktion die ursprünglichen Terminal-Einstellungen wieder her, die vor der Installation des Handlers aktiv waren.

Diese Funktion ist essenziell in nicht-blockierenden, ereignisgesteuerten CLI-Programmen: Wenn man Readline im Callback-Modus betreibt (z. B. in einer Ereignisschleife mit stream_select()), muss der Handler nach Abschluss der Eingabe oder bei Programmende sauber entfernt werden, damit das Terminal nicht in einem veränderten Zustand (z. B. ohne Echo) verbleibt.

Wird der Handler nicht ordnungsgemäß entfernt, können Terminalprobleme wie fehlende Zeichenausgabe oder deaktiviertes Zeilenecho entstehen – insbesondere in interaktiven Shell-Umgebungen. Ein Aufruf dieser Funktion am Ende des Programms oder nach der letzten Eingabe ist daher dringend empfohlen.

Gibt true zurück, wenn ein Handler aktiv war und erfolgreich entfernt wurde, andernfalls false.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn ein Callback-Handler installiert war und erfolgreich entfernt wurde. Gibt false zurück, wenn kein Handler installiert war.

Beispiele

Einfache interaktive Eingabeschleife mit Callback-Handler

<?php
// Callback, der bei vollständiger Eingabe einer Zeile aufgerufen wird
function eingabeVerarbeiten(?string $zeile): void
{
    if ($zeile === null || strtolower(trim($zeile)) === 'exit') {
        echo "Programm wird beendet.\n";
        readline_callback_handler_remove();
        exit(0);
    }
    echo "Eingabe erhalten: " . htmlspecialchars($zeile) . "\n";
    readline_add_history($zeile);
}

// Handler installieren
readline_callback_handler_install('Eingabe> ', 'eingabeVerarbeiten');

// Ereignisschleife
while (true) {
    $bereit = stream_select($lesen = [STDIN], $schreiben, $fehler, null);
    if ($bereit) {
        readline_callback_read_char();
    }
}

Handler nach einmaliger Eingabe sauber entfernen

<?php
$eingabe = null;

readline_callback_handler_install('Ihr Name: ', function (?string $zeile) use (&$eingabe): void {
    $eingabe = $zeile;
    // Handler sofort nach erster Eingabe entfernen
    readline_callback_handler_remove();
});

// Warten, bis eine Zeile eingegeben wurde
while ($eingabe === null) {
    $bereit = stream_select($lesen = [STDIN], $schreiben, $fehler, null);
    if ($bereit) {
        readline_callback_read_char();
    }
}

echo "Hallo, " . htmlspecialchars($eingabe) . "!\n";

// Wichtig · Fallstricke

Terminalzustand: Wird readline_callback_handler_remove() nicht aufgerufen, bevor das Programm endet, kann das Terminal in einem unbrauchbaren Zustand verbleiben (z. B. kein Echo, raw-Modus aktiv). In solchen Fällen hilft im Terminal der Befehl reset oder stty sane.

Nur CLI: Readline-Funktionen sind ausschließlich in der CLI-SAPI verfügbar und setzen voraus, dass PHP mit Readline-Unterstützung kompiliert wurde (z. B. --with-readline oder via libedit).

Mehrfachaufruf: Ein mehrfacher Aufruf ohne zwischenzeitliche Installation eines neuen Handlers ist harmlos – die Funktion gibt in diesem Fall lediglich false zurück.