Php 在类中包装Shell命令的模式

Php 在类中包装Shell命令的模式,php,oop,command-line-interface,Php,Oop,Command Line Interface,尽管不可取,但在web应用程序中,使用PHP的shell命令与非PHP系统命令交互仍然是快速实现某些结果的常用方法 是否有人将常见用例抽象成类库(Zend中的某些东西?),从而提供一种更合理/通用的处理方法?每次我遇到(或不得不产生)这种代码时,它都是一堆程序性的意大利面条,一遍又一遍地粘贴副本。我想知道(希望)PHP社区是否已经想出了一种更好的方法来处理在web/PHP应用程序中使用命令行应用程序的问题。执行命令行应用程序并不是什么坏事。事实上,这是Unix的方式。最重要的是,它比试图在纯PH

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


是否有人将常见用例抽象成类库(Zend中的某些东西?),从而提供一种更合理/通用的处理方法?每次我遇到(或不得不产生)这种代码时,它都是一堆程序性的意大利面条,一遍又一遍地粘贴副本。我想知道(希望)PHP社区是否已经想出了一种更好的方法来处理在web/PHP应用程序中使用命令行应用程序的问题。

执行命令行应用程序并不是什么坏事。事实上,这是Unix的方式。最重要的是,它比试图在纯PHP代码中重新实现ImageMagick更明智。(由于其cmdline参数的差异,如果您想寻找一个好的exec()抽象,请使用case。)

你能做的收尾工作不多。您最多可以通过以下方法将in-/output汇总到外部二进制文件:

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子方法进一步对代码进行语法化

根据您的实际用例,您可能能够隐藏一些标准选项。我这样做是为了,在这里,选项名与--cmdline=args的关系几乎是1:1:

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程序)的非常通用的抽象类可能不存在。

这是一个非常好的问题。to exec()提供了多种方法,主要是您描述的质量。。。那里有各种各样的功能化身,其中一种通常会起作用。也有一些更干净的OOP实现,但它们服务于非常特定的情况(比如在Linux中启动和停止进程)。如果有一个“完美”的实现,那就太好了。什么是“常见用例”?好吧,如果我能列出所有这些,并确信我了解它们,我可能会自己实现它,而不是询问是否有人已经实现了它。在任何看似简单的编程任务中,都有大量的常见情况是你没有想到的。我所说的“常见用例”的意思是,我希望解决方案已经被考虑出来,而不是一个封装shell调用的方法类。产生一个新的进程是一个昂贵的操作,2。通常有一个本地PHP扩展可以为您处理事情