2010-06-23 40 views
7

儘管不太明智,但使用PHP的shell命令與非php系統命令交互仍然是在Web應用程序中快速獲得特定結果的常用方法。在一個類中環繞shell命令的模式

有沒有人將常見用例抽象成類庫(Zend中的某些東西可能?),它提供了一種更加理智/常見的處理方法?每當我遇到(或必須出示)這種代碼時,它都是一堆程序化的意大利麪條,一遍又一遍地複製粘貼。我想知道是否(希望)PHP社區提出了一種更好的方式來處理在您的web/php應用程序中使用命令行應用程序。

+0

非常好的問題。 exec()的[User Contributed Notes](http://www.php.net/manual/en/function.exec.php)提供了多種方法,主要是你描述的質量,儘管...有很多種那裏的職能化身,其中一個通常會起作用。還有一些更清潔的OOP實現,但它們服務於非常特定的情況(如Linux中的啓動和停止進程)。有這個「完美」的實施將是非常好的。 – 2010-06-23 21:49:15

+1

什麼是「常見用例」? – Artefacto 2010-06-23 23:47:07

+0

那麼,如果我可以列出所有這些,並且有信心我知道他們,我可能會自己實現這一點,而不是詢問是否有人已經實現它。在任何看起來很簡單的編程任務中,都有許多你不會考慮的常見情況。我所說的「常見用例」的意思是我希望解決方案已經被認真考慮過了,而不是一個包裝shell調用的單一方法類。 – 2010-06-24 00:38:20

回答

3

執行命令行應用程序並沒有什麼骯髒之處。事實上,這是Unix的方式。最重要的是比試圖重新實現ImageMagick純PHP代碼。 (由於它的cmdline參數的差異,如果你尋找一個很好的exec()抽象的話,imagemagick is a bad example的情況。)

沒有太多的包裝可以做。在需要的地方 - (「$文件」,「O」) -

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

所以,你只需要調用> EXEC:在最好的情況,你可以總結輸入/輸出到外部二進制文件的方法。如果特定的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節目)可能不存在。

+0

我提到的不當行爲通常歸結爲1.產生一個新進程是一個昂貴的操作,並且2.通常有一個原生的PHP擴展可以爲你處理事情 – 2010-06-24 17:42:44