2010-06-23 43 views
7

尽管不太明智,但使用PHP的shell命令与非php系统命令交互仍然是在Web应用程序中快速获得特定结果的常用方法。在一个类中环绕shell命令的模式

有没有人将常见用例抽象成类库(Zend中的某些东西可能?),它提供了一种更加理智/常见的处理方法?每当我遇到(或必须出示)这种代码时,它都是一堆程序化的意大利面条,一遍又一遍地复制粘贴。我想知道是否(希望)PHP社区提出了一种更好的方式来处理在您的web/php应用程序中使用命令行应用程序。

+0

非常好的问题。 exec()的[User Contributed Notes](http://www.php.net/manual/en/function.exec.php)提供了多种方法,主要是你描述的质量,尽管...有很多种那里的职能化身,其中一个通常会起作用。还有一些更清洁的OOP实现,但它们服务于非常特定的情况(如Linux中的启动和停止进程)。有这个“完美”的实施将是非常好的。 – 2010-06-23 21:49:15

+1

什么是“常见用例”? – Artefacto 2010-06-23 23:47:07

+0

那么,如果我可以列出所有这些,并且有信心我知道他们,我可能会自己实现这一点,而不是询问是否有人已经实现它。在任何看起来很简单的编程任务中,都有许多你不会考虑的常见情况。我所说的“常见用例”的意思是我希望解决方案已经被认真考虑过了,而不是一个包装shell调用的单一方法类。 – 2010-06-24 00:38:20

回答

3

执行命令行应用程序并没有什么肮脏之处。事实上,这是Unix的方式。最重要的是比试图重新实现ImageMagick纯PHP代码。 (由于它的cmdline参数的差异,如果你寻找一个很好的exec()抽象的话,imagemagick is a bad example的情况。)

没有太多的包装可以做。在需要的地方 - (“$文件”,“O”) -

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

所以,你只需要调用> EXEC:在最好的情况,你可以总结输入/输出到外部二进制文件的方法。如果特定的cmdline应用程序在其参数命名方案中有固有的系统,那么只能使用专门的exec子方法进一步提高代码的性能。

根据您的实际使用情况,您可能会隐藏一些标准选项。我这样做是为了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节目)可能不存在。

+0

我提到的不当行为通常归结为1.产生一个新进程是一个昂贵的操作,并且2.通常有一个原生的PHP扩展可以为你处理事情 – 2010-06-24 17:42:44