Шаблон для обертывания команд Shell в классе

Несмотря на его inadvisability, с помощью команд оболочки PHP для взаимодействия с non-php системными командами остается распространенным способом быстрого достижения определенных результатов в веб-приложениях.

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

7
задан Charles 1 April 2011 в 03:24
поделиться

1 ответ

В выполнении приложений командной строки нет ничего грязного. Фактически, это путь Unix. И в большинстве случаев это разумнее, чем пытаться переопределить, например. ImageMagick в чистом PHP-коде. (Из-за несоответствия аргументов cmdline, imagemagick - плохой пример случая, если вы ищете красивую абстракцию exec ().)

Вы можете не так уж много заключить. В лучшем случае вы можете суммировать ввод / вывод во внешний двоичный файл в методе:

function exec($args) {
    $args = implode(" ", array_map("escapeshellcmd", func_get_args()));
    $opts = $this->opts();
    return `{$this->bin} {$args} {$opts}`;
}

Таким образом, вы просто вызываете -> exec ("- o", "$ file") там, где это необходимо. Ваш код можно обобщить только с помощью специализированных подметодов exec, если конкретное приложение cmdline имеет встроенную систему в схеме именования --argument.

В зависимости от вашего фактического варианта использования вы можете спрятать несколько стандартных опций. Я сделал это для pspell , где у вас есть отношение почти 1: 1 между именами параметров и --cmdline = args:

function opts() {
    $map = array(
       "--ignore" => $this->ignore,
       "--verbose" => $this->verbose,
       "--dir={$this->dir}" => isset($this->dir),
    );
    return implode(" ", array_keys(array_intersect($map, array(1=>1))));
}

Очень общий класс абстракции для exec / popen (для широкого диапазона cmdline программ), вероятно, не существует.

3
ответ дан 7 December 2019 в 16:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: