Readline clear history: примеры (PHP)

Очистка истории команд: работа с readline_clear_history
Раздел: Ввод данных
readline_clear_history: bool

Функция readline_clear_history

Описание

Функция readline_clear_history() полностью очищает историю введенных команд в интерактивной оболочке readline. Это встроенная функция PHP, предназначенная для работы в CLI (Command Line Interface) режиме.

Когда используется

Использование актуально в CLI-скриптах, которые интерактивно взаимодействуют с пользователем через консоль и используют расширение readline для улучшения ввода. Например, в пользовательских интерактивных оболочках, консольных утилитах с историей команд или скриптах, требующих сброса истории по определенному условию.

Аргументы

Функция не принимает никаких аргументов.

Возвращаемое значение: Функция возвращает true в случае успешного выполнения или false в случае возникновения ошибки, например, если расширение readline не доступно.

Примеры использования

Базовый пример очистки истории

Пример показывает, как добавить несколько элементов в историю и затем очистить ее.

<?php
readline_add_history('Команда 1');
readline_add_history('Команда 2');

// Вывод истории до очистки
var_dump(readline_list_history());

// Очистка истории
$result = readline_clear_history();

// Вывод результата очистки и истории после
var_dump($result);
var_dump(readline_list_history());
?>
array(2) {
  [0]=>
  string(16) "Команда 1"
  [1]=>
  string(16) "Команда 2"
}
bool(true)
array(0) {
}
Проверка доступности функции

Перед использованием стоит убедиться, что функция существует.

<?php
if (function_exists('readline_clear_history')) {
    if (readline_clear_history()) {
        echo "История readline очищена.\n";
    } else {
        echo "Не удалось очистить историю.\n";
    }
} else {
    echo "Функция readline_clear_history недоступна.\n";
}
?>
История readline очищена.

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

Прямых аналогов для очистки истории в стандартной библиотеке PHP нет, так как эта функция специфична для расширения readline. Однако существуют другие функции этого расширения для управления историей:

Когда что использовать: readline_clear_history() используется именно для полного сброса истории в памяти. Для работы с постоянным хранилищем истории (файлами) применяются readline_read_history и readline_write_history. Для проверки содержимого истории подходит readline_list_history.

Альтернативы в других языках

Readline clear history в Python

В стандартном модуле readline существует функция clear_history().

import readline

readline.add_history("import os")
readline.add_history("print('Hello')")
print("До:", readline.get_history_item(1))

readline.clear_history()

print("После:", readline.get_history_item(1))  # Вернет None
До: import os
После: None
JavaScript (Node.js)

В Node.js нет встроенного аналога в чистом виде. Для интерактивных приложений часто используют сторонние модули, такие как repl (Read-Eval-Print-Loop) с возможностью управления историей через внутренние методы или собственные реализации.

Bash/Shell

В bash можно очистить историю сессии командой history -c. Однако это влияет на историю сессии оболочки, а не отдельного скрипта.

Отличия от PHP

Основное отличие заключается в интеграции функции в экосистему языка. В PHP функция является частью отдельного расширения, которое может быть не активировано. В Python модуль readline также часто является внешней зависимостью, особенно на Windows. Управление историей в средах сценариев оболочки (bash) обычно глобальное для сессии, а не для процесса скрипта.

Типичные ошибки

1. Использование без поддержки readline

Самая частая проблема – вызов функции, когда расширение readline не установлено или не включено.

<?php
// В конфигурации PHP расширение readline отключено.
$result = readline_clear_history();
var_dump($result);
?>

Fatal error: Uncaught Error: Call to undefined function readline_clear_history()
2. Неправильные ожидания от возвращаемого значения

Функция возвращает булево значение, а не саму историю (которая теперь пуста).

<?php
readline_add_history("test");
$history = readline_clear_history();
echo "Очищенная история: ";
var_dump($history); // Выведет bool(true), а не пустой массив.
?>
Очищенная история: bool(true)
3. Очистка пустой истории

Вызов функции на уже пустой истории все равно возвращает true.

<?php
// История изначально пуста
$cleared = readline_clear_history();
var_dump($cleared);
?>
bool(true)

Изменения в версиях PHP

Для функции readline_clear_history() не было значимых изменений в поведении или синтаксисе на протяжении последних основных версий PHP, включая PHP 8.x. Это стабильная функция, существующая с ранних версий расширения readline.

Основные изменения в расширении readline касаются других функций, например, добавления поддержки nullable-типов для параметров $filename в readline_read_history и readline_write_history.

Рекомендуется всегда проверять актуальность информации в официальной документации PHP для конкретной используемой минорной версии.

Расширенные примеры

1. Интерактивная оболочка с сегментированной историей

Реализация простой оболочки, где история очищается при переключении на новый "сеанс" (например, по команде 'new').

Пример php
<?php
function runShell() {
    while (true) {
        $line = readline("МояОболочка> ");
        if ($line === 'exit') break;
        if ($line === 'new') {
            readline_clear_history();
            echo "[История очищена]\n";
            continue;
        }
        if (!empty(trim($line))) {
            readline_add_history($line);
        }
        // Эмуляция выполнения команды
        echo "Выполнено: $line\n";
    }
}
// Для демонстрации запустите в CLI
// runShell();
?>
2. Очистка истории на основе условия

Автоматическая очистка истории, если пользователь ввел определенное количество ошибочных команд (например, пустых строк).

Пример php
<?php
$emptyCount = 0;
$maxEmpty = 3;

while (true) {
    $input = readline("Введите число: ");
    readline_add_history($input);
    if (is_numeric($input)) {
        echo "Квадрат числа: " . ($input * $input) . "\n";
        $emptyCount = 0; // Сброс счетчика
    } else {
        if (trim($input) === '') {
            $emptyCount++;
            echo "Пустой ввод ($emptyCount из $maxEmpty)\n";
            if ($emptyCount >= $maxEmpty) {
                echo "Слишком много пустых вводов. Очищаю историю.\n";
                readline_clear_history();
                $emptyCount = 0;
            }
        } else {
            echo "Это не число.\n";
        }
    }
}
?>
3. Интеграция с сохранением в файл

Перед очисткой истории в памяти ее можно сохранить в файл для архивации.

Пример php
<?php
$historyFile = '/tmp/cli_history.txt';

// Загружаем старую историю из файла
readline_read_history($historyFile);

// ... Интерактивная работа с пользователем ...

// По команде 'archive_and_clear'
if ($userCommand === 'archive_and_clear') {
    $archiveFile = '/tmp/history_archive_' . date('Y-m-d_H-i-s') . '.txt';
    // Сохраняем текущую историю в архивный файл
    readline_write_history($archiveFile);
    // Очищаем активную историю
    if (readline_clear_history()) {
        echo "История сохранена в $archiveFile и очищена из памяти.\n";
    }
    // Теперь можно начать новую сессию с чистой историей
}
?>

PHP readline_clear_history function comments

En
Readline clear history Clears the history