执行命令行应用程序并不是什么肮脏的事情。实际上,这是Unix的方式。而且大多数情况下,这比试图在纯PHP代码中重新实现例如ImageMagick更加明智。(由于其cmdline args的差异,如果您正在寻找一个不错的exec()抽象,则
imagemagick是一个糟糕的例子。)
你不能做太多包装。最好的方法是将内部/外部二进制文件的输入/输出总结在一个方法中:
function exec($args) {
$args = implode(" ", array_map("escapeshellcmd", func_get_args()));
$opts = $this->opts();
return `{$this->bin} {$args} {$opts}`;
}
所以您只需在需要时调用 ->exec("-o", "$file")。如果特定的命令行应用程序具有固有的 --argument 命名方案,则可以使用专门的 exec 子方法进一步概括您的代码。
根据您实际的用例,您可能能够存储一些标准选项。我为
pspell 这样做了,其中选项名称与 --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(适用于各种命令行程序)。