Программа: Командная оболочка

Программа command-shell.php, показанная в примере 20.1, выдает приглашение, напоминающее приглашение командной оболочки, которое позволяет интерактивно выполнить PHP-программу. Она читает построчно с помощью функции readline(), а затем выполняет программу с помощью функции eval(). По умолчанию она выполняет каждую
строку сразу после ее ввода. Однако в многострочном режиме (указываемом с помощью параметров -m или --multiline) она сохраняет прочитанные строки, пока вы не введете символ . в отдельной строке; затем она запускает накопленный программный код. Кроме того, программа command-shell.php использует возможности Readline в части расширения слов, чтобы облегчить ввод PHP-функций.

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

% php -q command-shell.php
[1]> require 'DB.php';
[2]> $dbh = DB::connect('mysql://user:pwd@localhost/phpc');[3]> print_r($dbh->getAssoc('SELECT sign,planet,start_day
FROM zodiac WHERE element LIKE "water"'));
Array
(
[Cancer] => Array
(
[0] => Moon
[1] => 22
)
[Scorpio] => Array
(
[0] => Mars
[1] => 24
)
[Pisces] => Array
(
[0] => Neptune
[1] => 19
)
)

Код программы command-shell.php показан в примере 20.1.

Пример 20.1.


command-shell.php
// Загружаем библиотеку readline
if (! function_exists('readline')) {
dl('readline.'. (((strtoupper(substr(PHP_OS,0,3))) == 'WIN')?'dll':'so'))
or die("Readline library required\n");
}
// Загружаем класс Console_Getopt
require 'Console/Getopt.php';
$o = new Console_Getopt;
$opts = $o->getopt($o->readPHPArgv(),'hm',array('help','multiline'));
// Выходим с традиционным сообщением, если аргументы неправильные
if (PEAR::isError($opts)) {
print $opts->getMessage();
print "\n";
usage();
}
// поведение по умолчанию – это оценка каждой команды
// в том виде, как она введена
$multiline = false;
foreach ($opts[0] as $opt) {
// удаляем все начальные -s
$opt[0] = preg_replace('/^-+/','',$opt[0]);
// проверяем первый символ аргумента
switch($opt[0][0]) {case 'h':
// показываем подсказку
usage();
break;
case 'm':
$multiline = true;
break;
}
}
// устанавливаем показ ошибки
ini_set('display_errors',false);
ini_set('log_errors',true);
// строим таблицу расширения readline
$functions = get_defined_functions();
foreach ($functions['internal'] as $k => $v) {
$functions['internal'][$k] = "$v(";
}
function function_list($line) {
return $GLOBALS['functions']['internal'];
}
readline_completion_function('function_list');
$cmd = '';
$cmd_count = 1;
while (true) {
// получаем строку ввода пользователя
$s = readline("[$cmd_count]> ");
// добавляем ее в историю команд
readline_add_history($s);
// если мы в многострочном режиме:
if ($multiline) {
// если было введено только «.»
if ('.' == rtrim($s)) {
// выполняем код с помощью функции eval()
eval($cmd);
// удаляем накопленный программный код
$cmd = '';
// увеличиваем счетчик команд
$cmd_count++;
// выдаем следующее приглашение в новой строке
print "\n";
} else {
/* в противном случае добавляем новую строку (присоединяем символ
новой строки) к накопленному коду,благодаря чему остальные
введенные строки не превращаются в комментарии типа //
*/
$cmd .= $s."\n";;
}
} else {
// если мы не в многострочном режиме,// то выполняем строку с помощью функции eval()
eval($s);
// увеличиваем счетчик команд
$cmd_count++;
// выдаем следующее приглашение в новой строке
print "\n";
}
}
// показываем стандартную информацию подсказки
function usage() {
$my_name = $_SERVER['argv'][0];
print<<<_USAGE_
Usage: $my_name [-h|--help] [-m|--multiline]
-h, --help: display this help
-m, --multiline: execute accumulated code when "." is entered
by itself on a line.


The default is to execute
each line after it is entered.
_USAGE_;
exit(-1);
}.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Анализ аргументов программы
Анализ аргументов программы с помощью getopt
Показ в окне графических элементов управления
Показ в окне нескольких графических элементов управления
Показ меню

Вернуться в раздел: PHP / 20. PHP на стороне клиента