시스템 프로그램 실행 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.exe가command
에서 둘러싸는 따옴표를 제거할 수 있으며(자세한 내용은 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