2010-06-23 5 views
7

PHP의 셸 명령을 사용하여 비 PHP 시스템 명령과 상호 작용하는 것은 부적절하지만 웹 응용 프로그램의 특정 결과를 빠르게 달성하는 일반적인 방법으로 남아 있습니다.클래스의 셸 명령을 래핑하는 패턴

일반적인 사용 사례를 추상화 한 사람이 누구나이 클래스를 처리 할 수있는 좀 더 정상적인/일반적인 방법을 제공하는 클래스 라이브러리 (젠드의 경우일까요?)에 있습니까? 이런 종류의 코드를 만날 때마다 (또는 생성해야 할 때마다) 반복적으로 반복해서 붙여 넣는 절차 적 스파게티입니다. PHP 커뮤니티에서 웹/PHP 응용 프로그램의 명령 줄 응용 프로그램을 사용하여보다 나은 처리 방법을 생각해 냈는지 궁금합니다.

+0

아주 좋은 질문입니다. exec()에 대한 [User Contributed Notes] (http://www.php.net/manual/en/function.exec.php)는 다양한 접근법을 제공합니다. 주로 대부분의 품질에 대해 설명합니다. 기능의 화신, 그 중 하나가 일반적으로 작동합니다. 몇 가지 클리너 OOP 구현이 있지만 매우 구체적인 경우 (예 : Linux에서 프로세스 시작 및 중지)를 제공합니다. 이를 위해 "완벽한"구현을하는 것이 정말 좋을 것입니다. –

+1

"일반적인 사용 사례"는 무엇입니까? – Artefacto

+0

글쎄, 만약 내가 그 모든 것들을 나열하고 내가 그들을 알고 있다고 확신 할 수 있다면, 나는 누군가가 이미 그것을 구현했는지 묻는 대신에 이것을 직접 구현할 것이다. 단순한 것처럼 보이는 프로그래밍 작업에는 고려하지 않는 수많은 공통 조건이 있습니다. 필자가 "공통적 인 사용 사례"로 말한 것은 솔루션을 이미 생각하고, 쉘 호출을 래핑하는 단일 메서드 클래스가 아니라는 것입니다. –

답변

3

명령 줄 응용 프로그램을 실행해도 아무런 문제가 없습니다. 사실 유닉스 방식이다. 대부분의 경우 예를 들어 다시 구현하려고 시도하는 것보다 훨씬 건전합니다. 순수한 PHP 코드의 ImageMagick. (좋은 cmd (abstraction)을 찾으려면 cmdline args의 차이로 인해 imagemagick is a bad example 대소 문자를 찾으십시오.

많은 랩핑 작업을 수행 할 수 없습니다. 기껏해야 당신은 방법에 외부 바이너리 인 -/출력을 요약 할 수 있습니다 :

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

그래서 그냥 전화 -> 간부 ("- O", "$ 파일")를 필요한 곳. 특정 cmdline 앱에 고유 한 시스템이있는 경우 - 특권 명명법에 특수한 exec 서브 메쏘드로 코드를 추가 할 수 있습니다.

실제 사용 사례에 따라 몇 가지 표준 옵션을 숨길 수 있습니다. 간부 /는 popen에 대한

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

매우 일반적인 추상화 클래스 (있는 CmdLine 프로그램의 광범위한) : --cmdline하는 옵션 이름의 1의 관계 = 인수 : 나는 당신이 거의 1이 pspell 위해 이런 짓을 아마 존재하지 않을 것이다.

+0

필자가 언급 한 부적당 성은 일반적으로 1로 내려갑니다. 새 프로세스를 생성하는 것은 값 비싼 작업이며, 일반적으로 네이티브를 처리 할 네이티브 PHP 확장이 있습니다 –

관련 문제