2010-06-23 2 views
7

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

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

+0

Очень хороший вопрос. [Пользовательские примечания] (http://www.php.net/manual/en/function.exec.php) для exec() предлагают множество подходов, в основном из качества, которое вы описываете, хотя ... существуют различные воплощения функций там, один из которых обычно будет работать. Есть также несколько более чистых реализаций ООП, но они обслуживают очень конкретные случаи (например, запуск и остановка процессов в Linux). Было бы очень приятно иметь «идеальную» реализацию для этого. –

+1

Каковы «общие случаи использования»? – Artefacto

+0

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

ответ

3

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

Существует не так много обертывания, которое вы можете сделать. В лучшем случае вы можете суммировать вход/выход на свой внешний бинарник в методе:

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

Таким образом, вы просто звоните -> Exec («- о», «$ файл»), где это необходимо. Ваш код может быть дополнительно дополнен специализированными функциями exec, если конкретное приложение cmdline имеет встроенную систему в своей схеме именования.

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

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)))); 
} 

Очень универсальный класс абстракции для ехеса/POPEN (для широкого спектра программ командная_строки) вероятно, не существует.

+0

Неприемлемость, о которой я упоминаю, обычно сводится к 1. Появление нового процесса - дорогостоящая операция и 2. Обычно есть встроенное расширение PHP, которое будет обрабатывать вещи для вас –

Смежные вопросы