用于在类中封装Shell命令的模式

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

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


执行命令行应用程序并不肮脏。 事实上,这是Unix的方式。 大部分情况下,它比试图在纯PHP代码中重新实现ImageMagick更为明智。 (由于其cmdline参数的差异,如果您寻找一个很好的exec()抽象,imagemagick是一个不好的例子。)

你可以做的事情并不多。 充其量,您可以在一个方法中总结输入/输出到外部二进制文件:

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

所以你只需在需要的地方调用 - > exec(“ - o”,“$ file”)。 如果特定的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程序),一个非常通用的抽象类可能不存在。

链接地址: http://www.djcxy.com/p/1425.html

上一篇: Pattern for Wrapping Shell Commands in a Class

下一篇: effect free methods in the Java Standard Library