현재 위치: > 최신 기사 목록> Proc_terminate를 사용하여 하위 프로세스 출력을 얻기 위해 Stream_get_contents와 협력하는 방법은 무엇입니까?

Proc_terminate를 사용하여 하위 프로세스 출력을 얻기 위해 Stream_get_contents와 협력하는 방법은 무엇입니까?

gitbox 2025-06-09

1. Proc_open 이란 무엇입니까?

Proc_open 은 PHP의 기능으로 프로세스를 시작하고 상호 작용할 수 있습니다. 하위 프로세스의 출력을 읽고 입력을 쓰고 프로세스의 오류 출력을 얻을 수 있습니다. Exec 또는 Shell_Exec 과 달리 Proc_Open은 보다 강력한 제어 기능을 제공 할 수 있습니다.

2. 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는 출력 스트림에서 내용을 얻는 데 사용됩니다.


3. Proc_terminate를 사용하여 아동 프로세스를 종료하십시오

경우에 따라, 특히 아동 과정이 너무 길거나 붙어있는 경우 아동 과정이 종료되도록 강요해야 할 수도 있습니다. 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 로 프로세스를 종료했습니다. 프로세스를 종료 한 후에도 여전히 아동 프로세스의 출력 및 오류 정보를 얻을 수 있습니다.


4. 포괄적 인 예 : 아동 프로세스 출력 및 오류를 동시에 동시에 제어하는 ​​방법은?

이전 컨텐츠를 결합하면 프로세스를 시작하고 출력을 시작하고 오류 출력 및 필요한 경우 프로세스를 종료하는 방법을 보여주는 완전한 예입니다.

 $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을 통해 프로세스를 시작하여 출력 및 오류 정보를 읽습니다.