2010-06-23 10 views
7

A pesar de su desaconsejabilidad, el uso de comandos de shell de PHP para interactuar con comandos del sistema no php sigue siendo una forma común de lograr rápidamente ciertos resultados en aplicaciones web.Patrón para envolver comandos de shell en una clase

¿Alguien ha abstraído los casos de uso común en una biblioteca de clase (algo en Zend tal vez?) Que ofrece una manera más sana/común de manejar esto? Cada vez que encuentro (o tengo que producir) este tipo de código es un montón de spaghetti de procedimiento, copiado y pegado una y otra vez. Me preguntaba si (con la esperanza de que) la comunidad PHP haya encontrado una mejor manera de manejar aplicaciones de línea de comandos en sus aplicaciones web/php.

+0

Muy buena pregunta. Las [Notas de Contribución del Usuario] (http://www.php.net/manual/en/function.exec.php) a exec() ofrecen una variedad de enfoques, la mayoría de la calidad que describe, aunque ... hay varios encarnaciones de funciones allí, una de las cuales generalmente funcionará. También hay algunas implementaciones de OOP más limpias, pero atienden casos muy específicos (como iniciar y detener procesos en Linux). Sería realmente bueno tener la implementación "perfecta" para esto. –

+1

¿Cuáles son los "casos de uso común"? – Artefacto

+0

Bueno, si pudiera hacer una lista de todos ellos y estar seguro de que los conocía, probablemente lo implementaría yo mismo en lugar de preguntar si alguien ya lo había implementado. En cualquier tarea de programación que parezca simple, hay toneladas de condiciones comunes en las que no piensas. Todo lo que quise decir con "casos de uso común" fue que quería que la solución ya estuviera pensada, y no una sola clase de método que envuelva una llamada shell. –

Respuesta

3

Ejecutar aplicaciones de línea de comandos no es nada sucio. De hecho, es la forma de Unix. Y, sobre todo, es más sensato que tratar de volver a implementar, p. ImageMagick en código PHP puro. (Debido a la disparidad de sus argumentos línea de órdenes, imagemagick is a bad example caso si usted busca una abstracción agradable exec()).

no hay mucho de concluir que puede hacer. A lo sumo se puede resumir de entrada/salida a su binario externo en un método:

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

Por lo que sólo llaman -> exec ("- o", "$ archivo") cuando sea necesario. Su código solo se puede generalizar aún más con los submétodos ejecutivos de exec, si la aplicación cmdline particular tiene un sistema inherente en su esquema de denominación de argumentos.

Dependiendo de su caso de uso real, es posible que pueda esconder algunas opciones estándar. Hice esto por pspell, donde tiene casi 1: 1 relación de los nombres de las opciones a --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)))); 
} 

Una clase de abstracción muy genérico para exec/popen (para una amplia gama de programas de línea de órdenes) probablemente no exista

+0

La inconveniencia que menciono generalmente se reduce a 1. Generar un nuevo proceso es una operación costosa y 2. Generalmente hay una extensión PHP nativa que manejará las cosas por usted –

Cuestiones relacionadas