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

Просто интересно, можно ли создать интерактивную оболочку, используя только PHP. Я имею в виду что-то вроде вас с базами данных, python и т. Д.

Если да, то как?

Solutions Collecting From Web of "Интерактивная оболочка с использованием PHP"

Да, это возможно. Чтобы быть интерактивным, программа должна быть в состоянии ждать и читать входные данные пользователя из stdin . В PHP вы можете читать из stdin , открывая дескриптор файла на 'php://stdin' . Взятый из ответа на другой вопрос , вот пример интерактивной подсказки пользователя в PHP (при запуске из командной строки, конечно):

 echo "Continue? (Y/N) - "; $stdin = fopen('php://stdin', 'r'); $response = fgetc($stdin); if ($response != 'Y') { echo "Aborted.\n"; exit; } 

Конечно, чтобы получить полную строку ввода, а не один символ, вам понадобится fgets() вместо fgetc() . В зависимости от того, что будет делать ваша программа / оболочка, вся программа может быть структурирована как один большой непрерывный цикл. Надеюсь, это даст вам представление о том, как начать работу. Если вы хотите получить действительно фантазию (псевдо-GUI CLI), вы можете использовать ncurses .

Поскольку этот вопрос задан и дан ответ, в PHP добавлено лучшее решение . Во всех последних версиях PHP вы можете легко получить пользовательский ввод:

 $input = fgets(STDIN); 

Как я понимаю ваш вопрос, вы просто хотите, чтобы интерпретатор PHP запускался в командной строке, чтобы вы могли оценить любой введенный вами PHP-код. Я использую эту функцию Python все время, чтобы проверить фрагменты кода. В этом случае я считаю, что ответ, который вы ищете, должен выполняться (из командной строки):

 php -a 

Предполагая, что PHP находится на вашем пути, это приведет вас к интерпретатору PHP, как и к моему:

 $ php -a Interactive shell php > 

Оттуда вы можете начать оценивать произвольные выражения PHP и видеть результаты:

 php > $a = 'abcdef'; php > echo strlen($a); 6 

Вот расширенный подход к этому. Я добавил isCLI() если вы запустили свой скрипт как в CLI, так и на веб-сервере. В противном случае сервер мог бы использовать мою функцию. Это решение будет запрашивать у пользователя, проверять ввод и повторно запрашивать пользователя для фиксированного ввода, если это необходимо. I rtrim() потому что, если пользователь использует возврат для отправки своей записи, которая может быть добавлена ​​к записи. Проверка не нужна, просто не передавайте функцию в этом случае.

 function isCLI() { return (php_sapi_name() === 'cli' OR defined('STDIN')); } function userPrompt($message, $validator=null) { if (!isCLI()) return null; print($message); $handle = fopen ('php://stdin','r'); $line = rtrim(fgets($handle), "\r\n"); if (is_callable($validator) && !call_user_func($validator, $line)) { print("Invalid Entry.\r\n"); return userPrompt($message, $validator); } else { print("Continuing...\r\n"); return $line; } } // Example ===================== function validateSetLangCode($str) { return preg_match("/^[A-Z0-9]{3}-[AZ]{2}$/", $str); } $code = userPrompt("Please enter the set / language codes. Use the format 'SET-EN', where SET is the three-letter set code and EN is the two-letter lang code. \r\n", 'validateSetLangCode') ?: 'SET-EN'; var_dump($code); 

Не совсем ясно из вопроса, хотите ли вы CREATE shell использовать только PHP, или хотите, чтобы интерактивная оболочка обрабатывала команды PHP. Я собираюсь принять последнее, и в этом случае один пример – phpsh, который, по-видимому, был создан в Facebook, но написан на python.

Проверять, выписываться:

https://github.com/shaneharter/sheldon

Довольно легко начать. Он включает библиотеки Symfony2 и Zend Framework, которые выполняют большую часть основной работы ввода-вывода консоли и предоставляют абстракцию более высокого уровня, построенную вокруг объектов Command (с маршрутами регулярных выражений) и контекстов (которые содержат неизменяемое состояние).

Одна из вещей, которые мне нравятся, заключается в том, что «из коробки» ваше приложение может работать как интерактивная оболочка, или как стандартный скрипт, который вы можете запускать из командной строки, указать команду, передать любые аргументы и когда команда завершено, приложение завершает работу.

Я знаю, что вопросник не хотел второго варианта, но для тех, кто хотел второй вариант, как и я, помимо phpsh , у PHP также есть своя оболочка :

Просто запустите php -a .