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

时间:2010-06-23 21:24:26

标签: php oop command-line-interface

尽管不可行,但使用PHP的shell命令与非php系统命令进行交互仍然是在Web应用程序中快速实现某些结果的常用方法。

是否有人将常见用例抽象为类库(Zend中的某些内容?),它提供了一种更理智/常用的方法来处理这个问题?每当我遇到(或不得不生产)这种代码时,它就是一堆程序性意大利面,一遍又一遍地复制粘贴。我想知道(希望)PHP社区是否提出了一种更好的方法来处理在web / php应用程序中使用命令行应用程序。

1 个答案:

答案 0 :(得分:3)

执行命令行应用程序并不脏。实际上,这是Unix方式。而且大多数情况下,它比试图重新实现更安全。纯PHP代码中的ImageMagick。 (由于cmdline args的差异,如果你寻找一个很好的exec()抽象,imagemagick is a bad example就是这种情况。)

你可以做的事情并不多。您最多可以通过以下方法将输入/输出汇总到外部二进制文件:

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

所以你只需要在需要的地方调用 - > exec(“ - o”,“$ file”)。如果特定的cmdline应用程序在其--argument命名方案中具有固有系统,则只能使用专门的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程序)的非常通用的抽象类可能不存在。