2010-06-23 18 views
7

Önemsiz olmasına rağmen, php olmayan sistem komutlarıyla etkileşimde bulunmak için PHP'nin kabuk komutlarının kullanılması, web uygulamalarındaki belirli sonuçların hızlı bir şekilde elde edilmesinin yaygın bir yolu olmaya devam etmektedir.Bir Sınıftaki Sarma Kabuk Komutları için Desen

Ortak kullanım örneklerini, bir sınıf kitaplığına (Zend'de bir şey olabilir mi? Bu tür bir kodla karşılaştığımda (veya üretmek zorunda kaldığımda), tekrar tekrar kopyalanmış birtakım prosedürel spagetti. PHP topluluğunun, web/php uygulamalarınızda komut satırı uygulamalarını kullanarak daha iyi bir yol bulup getirmediğini merak ediyordum.

+0

Çok güzel bir soru. [Kullanıcı Katkı Notları] 'na (http://www.php.net/manual/en/function.exec.php) exec(), çoğunlukla tanımladığınız nitelikte çeşitli yaklaşımlar sunar. oradaki işlevlerin enkarnasyonları, bunlardan biri genellikle işe yarar. Ayrıca birkaç tane daha temiz OOP uygulaması vardır, fakat çok özel durumlara hizmet ederler (Linux'ta işlemlerin başlatılması ve durdurulması gibi). Bunun için "mükemmel" bir uygulamaya sahip olmak gerçekten güzel olurdu. –

+1

"Ortak kullanım durumları" nelerdir? – Artefacto

+0

Eğer bütün bunları listeleyip, onları tanıyabilsem, onları zaten tanıyor muydum? Basit görünen herhangi bir programlama görevinde, düşünmediğiniz pek çok yaygın koşul vardır. "Ortak kullanım durumları" ile kastettiğim tek şey, çözümün daha önce düşünülmesini istediğim ve bir kabuk çağrısını saran tek bir yöntem sınıfı değil. –

cevap

3

Komut satırı uygulamalarının yürütülmesi kirli bir şey değildir. Aslında, bu Unix yolu. Ve en çok, örneğin, yeniden uyarlamayı denemekten daha mantıklıdır. Saf PHP kodunda ImageMagick. (Cmdline hatalarının eşitsizliğinden dolayı, iyi bir exec() soyutlaması için bakarsanız imagemagick is a bad example durumu.)

Yapabileceğiniz fazla bir kaydırma yok. En iyi ihtimalle bir yöntemle harici ikili giriş/çıkış özetleyebiliriz:

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

Yani sadece çağrı -> exec ("- o", "$ file") gerektiğinde. Özel cmdline uygulamasının --argument adlandırma şemasında yerleşik bir sistemi varsa, kodunuz yalnızca özel exec alt formları ile daha da geniralize edilebilir.

Gerçek kullanım durumunuza bağlı olarak, birkaç standart seçeneği saklayabilirsiniz. exec/popen için

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)))); 
} 

bir çok genel soyutlama sınıfını (komut_satırı programlarının geniş bir yelpazede için): --cmdline seçeneği isimlerinden 1 ilişkiyi = args: Sana neredeyse 1 var pspell, için yaptım muhtemelen mevcut değil.

+0

Bahsettiğim inkaritivite genellikle 1'e iniyor. Yeni bir süreç yaratmak pahalı bir işlemdir. 2. Genellikle sizin için işleri halledecek yerel bir PHP uzantısı vardır. –

İlgili konular