시스템 프로그램 실행 proc_open

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

proc_open — 명령을 실행하고 입출력을 위한 파일 포인터 열기


설명

proc_open(
    array|string $command,
    array $descriptor_spec,
    array &$pipes,
    ?string $cwd = null,
    ?array $env_vars = null,
    ?array $options = null
): resource|false
                

proc_open()popen()과 유사하지만 프로그램 실행에 대해 훨씬 더 높은 수준의 제어를 제공합니다.


매개변수

command
문자열로 실행할 명령줄입니다. 특수 문자는 적절히 이스케이프 처리해야 하며 적절한 인용 부호를 적용해야 합니다.

참고: Windows에서 options에서 bypass_shell이 ​​true로 설정되지 않은 경우 command/c 플래그를 인용 부호 없는 문자열로 사용하여 cmd.exe(실제로는 %ComSpec%)로 전달됩니다(즉, proc_open()에 제공된 것과 동일). 이로 인해 cmd.execommand에서 둘러싸는 따옴표를 제거할 수 있으며(자세한 내용은 cmd.exe 설명서 참조) cmd.exe 오류 메시지에 전달된 command(일부)이 포함될 수 있으므로 예기치 않은 잠재적으로 위험한 동작이 발생할 수 있습니다(자세한 내용은 cmd.exe 아래 설명서 참조).

PHP 7.4.0부터 command은 명령 매개변수의 배열로 전달될 수 있습니다. 이 경우 프로세스는 쉘을 거치지 않고 직접 열리며 PHP는 필요한 인수 이스케이프를 처리합니다.

참고: Windows에서 배열 요소의 이스케이프 인수는 실행된 명령의 명령줄 구문 분석이 VC 런타임에 의해 수행된 명령줄 인수의 구문 분석과 호환된다고 가정합니다.

descriptor_spec
키가 설명자 번호를 나타내고 값이 PHP가 해당 설명자를 자식 프로세스에 전달하는 방법을 나타내는 인덱스 배열입니다. 0은 stdin, 1은 stdout, 2는 stderr입니다.

각 요소는 다음과 같을 수 있습니다.

  • 프로세스에 전달할 파이프를 설명하는 배열입니다. 첫 번째 요소는 설명자 유형이고 두 번째 요소는 지정된 유형에 대한 옵션입니다. 유효한 유형은 pipe(두 번째 요소는 파이프의 읽기 끝을 프로세스에 전달하는 r 또는 쓰기 끝을 전달하는 w) 및 file(두 번째 요소는 파일 이름)입니다. w 이외의 것은 r처럼 취급됩니다.
  • 실제 파일 설명자를 나타내는 스트림 리소스(예: 열린 파일, 소켓, STDIN).

파일 설명자 번호는 0, 1 및 2로 제한되지 않습니다. 유효한 파일 설명자 번호를 지정할 수 있으며 이는 자식 프로세스에 전달됩니다. 이렇게 하면 스크립트가 "공동 프로세스"로 실행되는 다른 스크립트와 상호 운용할 수 있습니다. 특히 PGP, GPG 및 openssl과 같은 프로그램에 보다 안전한 방식으로 암호를 전달하는 데 유용합니다. 또한 보조 파일 설명자에서 해당 프로그램이 제공하는 상태 정보를 읽는 데 유용합니다.

pipes
생성된 파이프의 PHP 끝에 해당하는 파일 포인터의 인덱스 배열로 설정됩니다.
cwd
명령의 초기 작업 디렉토리입니다. 이것은 절대 디렉토리 경로이거나 기본값(현재 PHP 프로세스의 작업 디렉토리)을 사용하려는 경우 null이어야 합니다.
env_vars
실행할 명령에 대한 환경 변수가 있는 배열 또는 현재 PHP 프로세스와 동일한 환경을 사용하려면 null
options
추가 옵션을 지정할 수 있습니다. 현재 지원되는 옵션은 다음과 같습니다.
  • suppress_errors(windows에만 해당): 이 함수가 true로 설정되면 이 함수에 의해 생성된 오류를 억제합니다.
  • bypass_shell(Windows만 해당): true로 설정하면 cmd.exe 셸을 우회합니다.
  • blocking_pipes(windows에만 해당): true로 설정하면 파이프를 강제로 차단합니다.
  • create_process_group(Windows 전용): true로 설정하면 자식 프로세스가 CTRL 이벤트를 처리할 수 있습니다.
  • create_new_console(Windows 전용): 새 프로세스에 부모의 콘솔을 상속하는 대신 새 콘솔이 있습니다.

반환 값

작업이 끝나면 proc_close()를 사용하여 해제해야 하는 프로세스를 나타내는 리소스를 반환합니다. 실패 시 false를 반환합니다.


변경 로그

버전 설명
7.4.4 options 매개변수에 create_new_console 옵션을 추가했습니다.
7.4.0 proc_open()은 이제 command에 대한 배열도 허용합니다.
7.4.0 options 매개변수에 create_process_group 옵션을 추가했습니다.

Examples

예제 #1 proc_open() 예제

                  
<?php
$descriptorspec = 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("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);

$cwd = '/tmp';
$env = array('some_option' => 'aeiou');

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);

if (is_resource($process)) {
    // $pipes now looks like this:
    // 0 => writeable handle connected to child stdin
    // 1 => readable handle connected to child stdout
    // Any error output will be appended to /tmp/error-output.txt

    fwrite($pipes[0], '<?php print_r($_ENV); ?>');
    fclose($pipes[0]);

    echo stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // It is important that you close any pipes before calling
    // proc_close in order to avoid a deadlock
    $return_value = proc_close($process);

    echo "command returned $return_value\n";
}
?>
                  
                

위의 예는 다음과 유사한 결과를 출력합니다.

Array
(
    [some_option] => aeiou
    [PWD] => /tmp
    [SHLVL] => 1
    [_] => /usr/local/bin/php
)
command returned 0
                

예제 #2 proc_open() quirk on Windows

다음 프로그램이 텍스트 검색을 위해 filename.txt 파일을 검색하고 결과를 인쇄할 것으로 예상할 수 있지만, 다소 다르게 작동합니다.

                  
<?php
$descriptorspec = [STDIN, STDOUT, STDOUT];
$cmd = '"findstr" "search" "filename.txt"';
$proc = proc_open($cmd, $descriptorspec, $pipes);
proc_close($proc);
?>
                  
                

위의 예는 다음을 출력합니다.

'findstr" "search" "filename.txt' is not recognized as an internal or external command,
operable program or batch file.
                

이 문제를 해결하려면 일반적으로 command을 추가 따옴표로 묶는 것으로 충분합니다.

$cmd = '""findstr" "search" "filename.txt""';
                

메모

메모:

Windows 호환성: 2(stderr) 이상의 설명자는 상속 가능한 핸들로 자식 프로세스에서 사용할 수 있지만 Windows 아키텍처는 파일 설명자 번호를 하위 수준 핸들과 연결하지 않기 때문에 자식 프로세스는 (아직) 액세스 수단이 없습니다. 그 손잡이. Stdin, stdout 및 stderr은 예상대로 작동합니다.

메모:

단방향(단방향) 프로세스 파이프만 필요한 경우 사용하기 훨씬 쉽기 때문에 대신 popen()을 사용하십시오.


기타

  • popen() - 프로세스 파일 포인터를 엽니다.
  • exec() - 외부 프로그램 실행
  • system() - 외부 프로그램을 실행하고 출력을 표시
  • passthru() - 외부 프로그램 실행 및 원시 출력 표시
  • stream_select() - 초 및 마이크로초로 지정된 시간 제한을 사용하여 지정된 스트림 배열에서 select() 시스템 호출과 동일한 기능을 실행합니다.
  • backtick operator