Proc_open 은 PHP의 기능으로 프로세스를 시작하고 상호 작용할 수 있습니다. 하위 프로세스의 출력을 읽고 입력을 쓰고 프로세스의 오류 출력을 얻을 수 있습니다. Exec 또는 Shell_Exec 과 달리 Proc_Open은 보다 강력한 제어 기능을 제공 할 수 있습니다.
먼저 아동 프로세스를 시작하려면 Proc_open을 사용해야합니다. Proc_Open 의 첫 번째 매개 변수는 명령 문자열이고, 두 번째 매개 변수는 파이프 라인 구성이며, 세 번째 매개 변수는 하위 프로세스 출력 및 오류를 수신하는 데 사용되는 배열입니다.
간단한 예는 다음과 같습니다.
$cmd = "ls -l"; // 어떤 명령으로 대체 할 수 있습니다
$descriptorspec = [
1 => ['pipe', 'w'], // 표준 출력
2 => ['pipe', 'w'], // 표준 오류
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// 아동 프로세스의 출력을 읽으십시오
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
// 读取표준 오류(있다면)
$error_output = stream_get_contents($pipes[2]);
fclose($pipes[2]);
// 프로세스를 닫으십시오
$exit_code = proc_close($process);
echo "Output:\n" . $output . "\n";
if ($error_output) {
echo "Error Output:\n" . $error_output . "\n";
}
echo "Exit Code: " . $exit_code . "\n";
}
이 예에서는 LS -L 명령을 시작하고 Stream_Get_Contents를 사용하여 표준 출력 및 표준 오류를 읽습니다. Proc_open을 사용하면 실행 중에 프로세스와 상호 작용할 수 있으며 Stream_get_Contents는 출력 스트림에서 내용을 얻는 데 사용됩니다.
경우에 따라, 특히 아동 과정이 너무 길거나 붙어있는 경우 아동 과정이 종료되도록 강요해야 할 수도 있습니다. Proc_terminate 함수는 실행중인 하위 프로세스를 종료하는 데 사용될 수 있습니다.
다음은 Proc_terminate를 사용하여 프로세스를 종료하는 예입니다.
$cmd = "sleep 10"; // 과정을 잠들게하십시오10두번째,장기적인 과정을 시뮬레이션합니다
$descriptorspec = [
1 => ['pipe', 'w'],
2 => ['pipe', 'w'],
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// 等待几두번째钟后终止子进程
sleep(3);
proc_terminate($process); // 강제 프로세스 종료
// 출력 및 오류를 읽습니다
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$error_output = stream_get_contents($pipes[2]);
fclose($pipes[2]);
echo "Output after termination:\n" . $output . "\n";
if ($error_output) {
echo "Error Output:\n" . $error_output . "\n";
}
// 프로세스 종료 코드를 가져옵니다
$exit_code = proc_close($process);
echo "Exit Code: " . $exit_code . "\n";
}
이 예에서는 Sleep 10을 사용하여 긴 달리기 프로세스를 시뮬레이션 한 다음 3 초 후에 Proc_terminate 로 프로세스를 종료했습니다. 프로세스를 종료 한 후에도 여전히 아동 프로세스의 출력 및 오류 정보를 얻을 수 있습니다.
이전 컨텐츠를 결합하면 프로세스를 시작하고 출력을 시작하고 오류 출력 및 필요한 경우 프로세스를 종료하는 방법을 보여주는 완전한 예입니다.
$cmd = "ping -c 4 google.com"; // 테스트 명령,ping Google
$descriptorspec = [
1 => ['pipe', 'w'], // 표준 출력
2 => ['pipe', 'w'], // 표준 오류
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// 프로세스의 출력을 읽으십시오
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
// 读取표준 오류输出
$error_output = stream_get_contents($pipes[2]);
fclose($pipes[2]);
// 프로세스를 닫으십시오并获取退出代码
$exit_code = proc_close($process);
echo "Output:\n" . $output . "\n";
if ($error_output) {
echo "Error Output:\n" . $error_output . "\n";
}
echo "Exit Code: " . $exit_code . "\n";
}
이 예에서는 Ping 명령을 사용하여 네트워크 연결을 테스트하고 Proc_Open을 통해 프로세스를 시작하여 출력 및 오류 정보를 읽습니다.