Шаблон для обмена командами оболочки в классе

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

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

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