Readline redisplay: примеры (PHP)
readline_redisplay: voidФункция readline_redisplay в PHP используется для принудительного обновления отображения строки ввода в интерактивных CLI-приложениях. Её применяют, когда нужно перерисовать текущую строку ввода после изменения состояния программы в фоновом режиме, без вмешательства пользователя.
Функция доступна только в CLI-режиме при включённой поддержке readline. Она не принимает аргументов и всегда возвращает null. Работает, перезаписывая текущую строку в терминале, что полезно при обработке сигналов или при асинхронном изменении контекста ввода.
readline_redisplay обычно вызывается после модификации переменных, влияющих на приглашение ввода (prompt), или после обновления данных в фоне. Функция перерисовывает строку с учётом текущего содержимого буфера ввода и позиции курсора.
Простое обновление строки ввода:
<?php
readline_add_history('Первая команда');
// Пользователь начал ввод новой команды
// Имитация фонового события
readline_redisplay();
?>В терминале строка ввода будет перерисована без изменений.
<?php
$prompt = 'Введите команду: ';
$input = readline($prompt);
// В фоновом режиме prompt изменился
$prompt = 'Новое приглашение: ';
readline_redisplay(); // Строка перерисуется с новым prompt
?>После выполнения пользователь увидит обновлённое приглашение.
Устанавливает обработчик callback для readline, позволяющий асинхронно обновлять интерфейс. Используется в сочетании с readline_callback_read_char для более сложных интерактивных приложений.
Расширение ncurses предоставляет полный контроль над терминалом. Подходит для создания сложных текстовых интерфейсов, но требует больше кода для реализации.
readline_redisplay оптимальна для простого обновления строки ввода. Для сложных TUI-приложений предпочтительнее ncurses, а для асинхронной обработки - callback-механизм readline.
Readline redisplay в Python
Модуль readline содержит функцию redisplay:
import readline
# После изменения состояния
readline.redisplay()Прямого аналога нет, но можно использовать модуль readline с методом write:
const readline = require('readline');
const rl = readline.createInterface(process.stdin, process.stdout);
rl.write(null, { ctrl: true, name: 'l' }); // Эмуляция очисткиИспользуются управляющие последовательности:
echo -e '\033[2K\rНовая строка'В отличие от PHP, в bash требуется ручное управление курсором.
<?php
// Запуск через веб-сервер
readline_redisplay();
?>Результат: предупреждение о неопределённой функции.
<?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
declare(ticks=1);
$message = '';
pcntl_signal(SIGUSR1, function() use (&$message) {
$message = ' [Получен сигнал]';
readline_redisplay();
});
$line = readline("Ввод$message: ");
?>При получении сигнала строка ввода обновится с новым сообщением.
<?php
$counter = 0;
$timer = function() use (&$counter) {
$counter++;
readline_redisplay();
};
// Имитация таймера
register_tick_function($timer);
$input = readline("[Секунд: $counter] Команда: ");
unregister_tick_function($timer);
?>Счётчик в prompt будет обновляться без прерывания ввода.
<?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();
}
}
?>Фильтрация цифр в реальном времени с перерисовкой.