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

Использование readline_read_history для работы с историей команд
Раздел: Ввод данных
readline_read_history(string $filename = ?): bool

Функция readline_read_history

Описание и назначение

Функция readline_read_history() в PHP относится к расширению Readline и предназначена для загрузки истории командной строки из файла. Она используется в интерактивных CLI-приложениях для восстановления ранее введённых пользователем команд между сессиями. Это улучшает пользовательский опыт, позволяя использовать стрелки вверх/вниз для навигации по истории.

Аргументы функции

Функция имеет один необязательный аргумент:

  • ?string $filename – путь к файлу, из которого будет загружена история. Если аргумент не указан или равен null, используется файл по умолчанию (часто это ~/.history или файл, заданный readline_read_history_file()).

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

Базовое использование

Загрузка истории из файла по умолчанию:

<?php
if (function_exists('readline_read_history')) {
    $result = readline_read_history();
    var_dump($result);
}
bool(true) // Если файл существует и чтение успешно
Указание конкретного файла
<?php
$loaded = readline_read_history('/tmp/my_cli_history.txt');
echo $loaded ? 'История загружена' : 'Ошибка загрузки';
История загружена

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

  • readline_list_history() – возвращает массив всей истории команд. Полезна для программной обработки истории.
  • readline_write_history() – сохраняет текущую историю в файл. Используется в паре с readline_read_history().
  • readline_clear_history() – очищает внутренний массив истории. Применяется для сброса состояния.
  • readline_add_history() – добавляет одну строку в историю. Основная функция для пополнения истории.

readline_read_history() предпочтительнее для начальной загрузки истории из файла, в то время как readline_list_history() используется для чтения уже загруженной истории в память.

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

Python
import readline
readline.read_history_file('.python_history')  # Загрузка
print(readline.get_history_item(1))  # Чтение
command_from_history
JavaScript (Node.js с модулем readline)
const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  historySize: 1000
});
// История управляется внутри сессии, аналога для файла нет в стандартном API
Bash (shell)
history -r ~/.bash_history  # Чтение истории
# История загружена в текущую сессию

В отличие от PHP, Python предоставляет прямое управление файлом истории. В Node.js нет встроенной функции загрузки истории из файла, а в Bash управление историей встроено в оболочку.

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

Отсутствие расширения Readline
<?php
$result = readline_read_history();
var_dump($result);
Fatal error: Uncaught Error: Call to undefined function readline_read_history()

Решение: Убедиться, что расширение Readline установлено и включено в php.ini.

Некорректный путь к файлу
<?php
$result = readline_read_history('/non_existent/history.txt');
var_dump($result);
bool(false) // Функция вернёт false

Решение: Проверить существование файла и права доступа перед вызовом функции.

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

В PHP 8.1.0 аргумент $filename стал nullable (может принимать значение null). Это позволяет явно указывать загрузку из файла по умолчанию.

<?php
// До PHP 8.1.0
readline_read_history(); // Без аргументов

// Начиная с PHP 8.1.0 можно явно передать null
readline_read_history(null); // То же самое

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

Загрузка с обработкой ошибок
Пример php
<?php
function loadHistorySafe(?string $file = null): bool {
    if (!function_exists('readline_read_history')) {
        throw new RuntimeException('Расширение Readline не доступно');
    }
    
    $result = readline_read_history($file);
    
    if ($result === false) {
        // Можно логировать ошибку или создавать файл
        if ($file && !file_exists($file)) {
            touch($file); // Создаём пустой файл истории
            return true;
        }
        return false;
    }
    return true;
}

// Использование
try {
    loadHistorySafe('/custom/path/history.log');
    echo 'История инициализирована';
} catch (RuntimeException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
История инициализирована
Объединение истории из нескольких файлов
Пример php
<?php
// Загружаем основную историю
readline_read_history('/primary.hist');

// Добавляем команды из дополнительного файла
$extraHistory = file('/extra.hist', FILE_IGNORE_NEW_LINES);
foreach ($extraHistory as $line) {
    readline_add_history($line);
}

// Сохраняем объединённую историю
readline_write_history('/combined.hist');
Использование в интерактивном цикле
Пример php
<?php
// Загружаем историю при запуске скрипта
readline_read_history('/tmp/app_history.txt');

while (true) {
    $input = readline('Введите команду: ');
    readline_add_history($input);
    
    if ($input === 'exit') {
        // Сохраняем историю перед выходом
        readline_write_history('/tmp/app_history.txt');
        break;
    }
    
    echo 'Вы ввели: ' . $input . PHP_EOL;
}
Введите команду: test
Вы ввели: test
Введите команду: exit // История сохраняется

PHP readline_read_history function comments

En
Readline read history Reads the history