Шаблон для переноса команд оболочки в классе - PullRequest
7 голосов
/ 24 июня 2010

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

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

1 Ответ

3 голосов
/ 24 июня 2010

Выполнение приложений командной строки не является чем-то грязным. На самом деле это способ 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 имеет собственную систему в своей схеме именования аргументов.

В зависимости от вашего фактического использования вы можете спрятать несколько стандартных опций. Я сделал это для 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), вероятно, не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...