2011-09-07 4 views
3

긴 문자열이 포함 된 변수가 있습니다. (구체적으로 자바 스크립트 코드 몇 킬로 바이트 포함)PHP에서 변수 물마루의 내용을 외부 명령에 전달하는 방법은 무엇입니까?

이 문자열을 외부 명령 (이 경우에는 javascript-compressor)에 전달하고 PHP에서 외부 명령 (압축 된 javascript)의 출력을 캡처하고 싶습니다. 그것을 변수에 할당합니다.

PHP에서 자바 스크립트를 압축하는 클래스가 있다는 것을 알고 있지만 이것은 일반적인 문제의 한 예일뿐입니다.

는 원래 우리가 사용 :이 작은 문자열을 작동하지만, 안전하지

$newvar = passthru("echo $oldvar | compressor"); 

. (oldvar가 쉘에 특별한 의미를 갖는 문자를 포함하면 아무 일도 일어나지 않을 수 있습니다.)

escapeshellarg로 이스케이프 처리하면 최대 허용 인수 길이에 대한 OS 제한 때문에 긴 문자열에 대한 해결책이 해결됩니다.

popen("command" "w")을 사용해 보았는데 명령에 쓰려고 시도했지만 명령의 출력이 자동으로 사라집니다. 이 과정을 모두 표준 출력 및 표준 입력에 핸들을 얻을 따라서에 데이터를 작성하고 결과를 읽을 수 α- 함수 proc_open를 사용

$newvar = external_command($oldvar); 

답변

2

:

개념적으로, 난 그냥에 해당하고 싶어 .

0

rumpels 제안을 사용하여 다음과 같은 솔루션을 사용할 수있었습니다. 이 질문에 관심있는 다른 사람의 이익을 위해 여기에 게시하십시오.

public static function extFilter($command, $content){ 
    $fds = array(
     0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
     1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
     2 => array("pipe", "w") // stderr is a pipe that the child will write to 
    ); 
    $process = proc_open($command, $fds, $pipes, NULL, NULL); 
    if (is_resource($process)) { 
     fwrite($pipes[0], $content); 
     fclose($pipes[0]); 
     $stdout = stream_get_contents($pipes[1]); 
     fclose($pipes[1]); 
     $stderr = stream_get_contents($pipes[2]); 
     fclose($pipes[2]); 
     $return_value = proc_close($process); 
     // Do whatever you want to do with $stderr and the commands exit-code. 
    } else { 
     // Do whatever you want to do if the command fails to start 
    } 
    return $stdout; 
} 

교착 상태 문제가있을 수 있습니다 : 보낼 데이터가 파이프의 결합 된 크기보다 큰 경우, 외부 명령은 PHP가 차단하면서, 표준 출력의에서 사람이 읽을 기다리고 차단합니다, stdin이 더 많은 입력을위한 공간을 만들기 위해 읽히기를 기다립니다.

아마도 PHP는이 문제를 어떻게 든 처리하지만, 파이프에 맞는 것보다 많은 데이터를 보내거나받을 계획이면 테스트해볼 가치가 있습니다.

관련 문제