Readline redisplay: примеры (PHP)

Функция readline_redisplay в PHP 8: применение и примеры
Раздел: Ввод данных
readline_redisplay: void
PHP функция readline_redisplay

Функция readline_redisplay в PHP используется для принудительного обновления отображения строки ввода в интерактивных CLI-приложениях. Её применяют, когда нужно перерисовать текущую строку ввода после изменения состояния программы в фоновом режиме, без вмешательства пользователя.

Функция доступна только в CLI-режиме при включённой поддержке readline. Она не принимает аргументов и всегда возвращает null. Работает, перезаписывая текущую строку в терминале, что полезно при обработке сигналов или при асинхронном изменении контекста ввода.

Архитектура использования

readline_redisplay обычно вызывается после модификации переменных, влияющих на приглашение ввода (prompt), или после обновления данных в фоне. Функция перерисовывает строку с учётом текущего содержимого буфера ввода и позиции курсора.

Простые примеры использования
Базовый вызов функции

Простое обновление строки ввода:

<?php
readline_add_history('Первая команда');
// Пользователь начал ввод новой команды
// Имитация фонового события
readline_redisplay();
?>

В терминале строка ввода будет перерисована без изменений.

Использование с изменением prompt
<?php
$prompt = 'Введите команду: ';
$input = readline($prompt);
// В фоновом режиме prompt изменился
$prompt = 'Новое приглашение: ';
readline_redisplay(); // Строка перерисуется с новым prompt
?>

После выполнения пользователь увидит обновлённое приглашение.

Похожие функции в PHP

Устанавливает обработчик callback для readline, позволяющий асинхронно обновлять интерфейс. Используется в сочетании с readline_callback_read_char для более сложных интерактивных приложений.

ncurses-функции

Расширение ncurses предоставляет полный контроль над терминалом. Подходит для создания сложных текстовых интерфейсов, но требует больше кода для реализации.

Выбор инструмента

readline_redisplay оптимальна для простого обновления строки ввода. Для сложных TUI-приложений предпочтительнее ncurses, а для асинхронной обработки - callback-механизм readline.

Аналоги в других языках

Readline redisplay в Python

Модуль readline содержит функцию redisplay:

import readline
# После изменения состояния
readline.redisplay()
JavaScript (Node.js)

Прямого аналога нет, но можно использовать модуль readline с методом write:

const readline = require('readline');
const rl = readline.createInterface(process.stdin, process.stdout);
rl.write(null, { ctrl: true, name: 'l' }); // Эмуляция очистки
Bash/Shell

Используются управляющие последовательности:

echo -e '\033[2K\rНовая строка'

В отличие от PHP, в bash требуется ручное управление курсором.

Типичные ошибки
Вызов в неподходящем режиме
<?php
// Запуск через веб-сервер
readline_redisplay();
?>

Результат: предупреждение о неопределённой функции.

Отсутствие расширения readline
<?php
// На системе без readline
if (function_exists('readline_redisplay')) {
    readline_redisplay();
}
?>

Функция недоступна, условие пропускает вызов.

Многократный вызов без необходимости

Частые вызовы могут вызывать мерцание в терминале. Рекомендуется использовать функцию только при реальном изменении данных.

История изменений

Функция readline_redisplay была добавлена в PHP 7.1.0. В PHP 8.0 и 8.1 значительных изменений не было. Поведение функции остаётся стабильным. В PHP 8.2 улучшена интеграция с механизмами обработки ошибок при работе в CLI-режиме.

Важное замечание: с PHP 7.1 функция доступна только при компиляции с поддержкой readline (--with-readline). В Windows требуется установка соответствующего расширения.

Расширенные примеры
Обработка сигналов с перерисовкой
Пример php
<?php
declare(ticks=1);

$message = '';

pcntl_signal(SIGUSR1, function() use (&$message) {
    $message = ' [Получен сигнал]';
    readline_redisplay();
});

$line = readline("Ввод$message: ");
?>

При получении сигнала строка ввода обновится с новым сообщением.

Динамическое обновление подсказки
Пример php
<?php
$counter = 0;
$timer = function() use (&$counter) {
    $counter++;
    readline_redisplay();
};

// Имитация таймера
register_tick_function($timer);

$input = readline("[Секунд: $counter] Команда: ");
unregister_tick_function($timer);
?>

Счётчик в prompt будет обновляться без прерывания ввода.

Интерактивный фильтр
Пример php
<?php
function filter_input($input) {
    // Удаляем цифры из ввода
    return preg_replace('/\d/', '', $input);
}

readline_callback_handler_install('> ', function($input) {
    static $filtered = '';
    $filtered = filter_input($input);
    if ($input !== $filtered) {
        readline_redisplay(); // Перерисовка если были цифры
    }
});

while (true) {
    $r = array(STDIN);
    $w = $e = null;
    if (stream_select($r, $w, $e, 0, 100000)) {
        readline_callback_read_char();
    }
}
?>

Фильтрация цифр в реальном времени с перерисовкой.

PHP readline_redisplay function comments

En
Readline redisplay Redraws the display