尽管不可行,但使用PHP的shell命令与非php系统命令进行交互仍然是在Web应用程序中快速实现某些结果的常用方法。
是否有人将常见用例抽象为类库(Zend中的某些内容?),它提供了一种更理智/常用的方法来处理这个问题?每当我遇到(或不得不生产)这种代码时,它就是一堆程序性意大利面,一遍又一遍地复制粘贴。我想知道(希望)PHP社区是否提出了一种更好的方法来处理在web / php应用程序中使用命令行应用程序。
答案 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程序)的非常通用的抽象类可能不存在。