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

Использование readline_list_history для работы с историей команд в PHP
Раздел: Ввод данных
readline_list_history: array
Описание функции readline_list_history

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

Функция не принимает аргументов и возвращает массив, содержащий все записи истории. Каждый элемент массива соответствует одной команде в истории. Если история пуста или функция недоступна, возвращается пустой массив.

Особенности работы

Функция доступна только при активном расширении readline. Ее использование без поддержки readline приводит к предупреждению и возврату пустого массива. История команд сохраняется в течение сессии и может быть заполнена через readline_add_history или интерактивный ввод.

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

Простой пример вызова функции:

<?
// Добавляем несколько команд в историю
readline_add_history('command1');
readline_add_history('command2');

// Получаем историю
$history = readline_list_history();
print_r($history);
?>
Array
(
    [0] => command1
    [1] => command2
)
Проверка пустой истории
<?
// Очищаем историю (пример)
// readline_clear_history();

$history = readline_list_history();
var_dump($history);
?>
array(0) {
}
Похожие функции в PHP

Функция readline_info возвращает или устанавливает различные параметры readline, включая данные о истории. Может предоставить больше контекстной информации.

readline_read_history и readline_write_history

Функции для чтения и записи истории в файл. Полезны для сохранения истории между сессиями, тогда как readline_list_history работает только с текущей сессией.

Очищает текущую историю. Используется для управления содержимым, которое затем можно получить через readline_list_history.

Аналоги в других языках
Python: readline.get_history_item

В Python модуль readline предоставляет функцию get_history_item для получения конкретного элемента истории. Для получения всей истории используется readline.get_current_history_length и цикл.

import readline
for i in range(1, readline.get_current_history_length() + 1):
    print(readline.get_history_item(i))
command1
command2
JavaScript (Node.js): readline.createInterface

В Node.js история управляется через объект Interface. Прямого аналога нет, но история хранится во внутреннем массиве.

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    historySize: 50
});
// История доступна через rl.history
Bash: история через команду history

В bash история команд доступна через встроенную команду history, которая выводит список с номерами.

Типичные ошибки
Отсутствие расширения readline

Вызов функции без поддержки readline вызывает предупреждение.

<?
// Если расширение readline не загружено
$history = readline_list_history();
var_dump($history);
?>
PHP Warning:  readline_list_history(): Unable to get history
array(0) {
}
Некорректный контекст вызова

Функция предназначена для CLI-режима. В веб-среде она не имеет практического смысла и может не работать.

Ожидание изменяемого возвращаемого значения

Функция возвращает новый массив при каждом вызове. Изменение этого массива не влияет на исходную историю.

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

Функция readline_list_history была добавлена в PHP 4.3.0. С тех пор ее поведение остается стабильным.

PHP 8.0 и выше

В PHP 8.0 существенных изменений в работе функции не произошло. Расширение readline продолжает поддерживаться без депрекации.

Важно отметить, что в некоторых сборках PHP расширение readline может отсутствовать, что приводит к недоступности функции.

Расширенные примеры
Фильтрация истории по шаблону
Пример php
<?
// Добавляем тестовые данные
readline_add_history('git commit -m "Initial"');
readline_add_history('php -v');
readline_add_history('git status');
readline_add_history('ls -la');

// Получаем историю и фильтруем команды git
$history = readline_list_history();
$gitCommands = array_filter($history, function($cmd) {
    return strpos($cmd, 'git') === 0;
});
print_r($gitCommands);
?>
Array
(
    [0] => git commit -m "Initial"
    [2] => git status
)
Сохранение истории в файл
Пример php
<?
// Загружаем историю из файла, если существует
$historyFile = 'history.txt';
if (file_exists($historyFile)) {
    readline_read_history($historyFile);
}

// Интерактивный ввод
$line = readline('Введите команду: ');
readline_add_history($line);

// Получаем и отображаем историю
$history = readline_list_history();
echo "Текущая история:\n";
foreach ($history as $index => $command) {
    echo sprintf("%d: %s\n", $index + 1, $command);
}

// Сохраняем историю
readline_write_history($historyFile);
?>
Анализ частоты команд
Пример php
<?
// Имитация истории
$commands = ['ls', 'cd', 'ls', 'php', 'ls', 'git'];
foreach ($commands as $cmd) {
    readline_add_history($cmd);
}

// Подсчет частоты
$history = readline_list_history();
$frequency = array_count_values($history);
arsort($frequency);
print_r($frequency);
?>
Array
(
    [ls] => 3
    [cd] => 1
    [php] => 1
    [git] => 1
)
Интеграция с кастомным автодополнением
Пример php
<?
readline_completion_function(function($input, $index) {
    $history = readline_list_history();
    $matches = [];
    foreach ($history as $command) {
        if (strpos($command, $input) === 0) {
            $matches[] = $command;
        }
    }
    return $matches;
});

// Демонстрация: ввод 'gi' предложит 'git' из истории
?>

PHP readline_list_history function comments

En
Readline list history Lists the history