현재 위치: > 최신 기사 목록> Popen을 통해 프로세스의 입력 및 출력 스트림을 열고 데이터와 상호 작용하는 방법은 무엇입니까?

Popen을 통해 프로세스의 입력 및 출력 스트림을 열고 데이터와 상호 작용하는 방법은 무엇입니까?

M66 2025-07-07

PHP에서 Popen은 프로세스 데이터와 상호 작용할 수 있도록 프로세스의 입력 및 출력 스트림을 열는 데 사용할 수있는 매우 유용한 기능입니다. 이 기능은 외부 명령을 실행하고 외부 프로그램 호출, 스크립트 실행 또는 다른 시스템과 상호 작용하는 등 출력을 가져와야 할 때 종종 유용합니다.

Popen 기능이란 무엇입니까?

Popen 함수는 프로세스를 열고 프로세스의 입력 또는 출력 스트림에 대한 파일 포인터를 반환하는 데 사용됩니다. 이 기능에는 두 가지 매개 변수가 있습니다.

 resource popen(string $command, string $mode);
  • $ 명령 : 실행되는 명령은 일반적으로 쉘 명령입니다.

  • $ 모드 : 작동 모드, R은 읽기 모드를 나타내고 W는 쓰기 모드를 나타내고 R+는 읽기 및 쓰기 모드를 나타냅니다.

예를 들어:

 $handle = popen("ls -l", "r");

위의 코드는 프로세스를 열고 LS -L 명령을 실행하며 프로세스의 출력을 읽을 수 있습니다.

Popen을 통해 프로세스와 상호 작용하는 방법은 무엇입니까?

Popen 의 반환 값은 파일과 같이 데이터를 읽거나 쓸 수있는 파일 포인터입니다. 프로세스와 상호 작용할 때 일반적으로 Fread 또는 FGES를 사용하여 프로세스의 출력 스트림에서 데이터를 읽거나 Fwrite를 사용하여 프로세스 입력 스트림에 데이터를 작성해야합니다.

1. 프로세스에서 데이터를 읽으십시오

외부 명령에서 데이터를 가져 와서 처리하려고한다고 가정하면 코드 예제는 다음과 같습니다.

 $handle = popen("ls -l", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "프로세스를 열 수 없습니다";
}

여기서, 우리는 더 이상 출력이 없을 때까지 프로세스 출력의 각 라인을 읽기 위해 FGET를 통과합니다.

2. 프로세스에 데이터를 작성하십시오

프로세스의 표준 입력 스트림에 데이터를 작성 해야하는 경우 PopenW 모드를 통해 수행 할 수 있습니다.

 $handle = popen("sort", "w");
if ($handle) {
    fwrite($handle, "banana\napple\ncherry\n");
    fclose($handle);
} else {
    echo "프로세스를 열 수 없습니다";
}

위의 코드는 정렬 명령을 시작하고 표준 입력 스트림에 데이터를 씁니다. 정렬은 이 데이터를 정렬합니다.

3. 데이터를 읽고 쓰십시오

동시에 데이터를 읽고 작성 해야하는 경우 R+ 모드를 사용할 수 있습니다. 이 접근법은 프로세스와의 양방향 통신이 필요한 상황에 적합합니다.

 $handle = popen("tee /tmp/output.txt", "r+");
if ($handle) {
    fwrite($handle, "Hello, world!\n");
    fflush($handle);  // 데이터가 작성되었는지 확인하십시오
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "프로세스를 열 수 없습니다";
}

이 예에서는 Tee 명령을 통해 /tmp/output.txt 파일에 데이터를 작성하고 프로세스 출력에서 ​​데이터를 읽습니다.

Popen을 사용하여 네트워크 요청을합니다

때로는 Popen을 통해 네트워크 관련 명령을 실행해야 할 수도 있습니다. CURL 또는 WGET 와 같은 명령 줄 도구를 통해 원격 자원을 요청할 수 있습니다. 다음은 Curl을 통해 웹 페이지를 얻는 방법을 보여주는 예입니다.

 $handle = popen("curl -s http://m66.net", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
} else {
    echo "프로세스를 열 수 없습니다";
}

위의 코드는 컬을 통해 http://m66.net을 요청하고 반환 된 컨텐츠를 한 줄씩 출력합니다.

주목해야 할 것

  1. 프로세스 수명주기 : POPEN 이 시작한 프로세스는 PHP 스크립트가 실행 된 후 자동으로 닫힙니다. 자원의 올바른 릴리스를 보장하려면 스크립트가 끝나기 전에 FCLOSE를 호출하여 파일 포인터를 닫습니다.

  2. 보안 : Popen을 사용할 때주의하십시오. 수신 명령 또는 매개 변수가 악의적 인 사용자에 의해 조작되지 않도록하고 명령의 일부로 사용자 입력을 직접 사용하지 않도록하십시오.

  3. 성능 : Popen은 프로세스 간 통신을 촉진 할 수 있지만 외부 프로세스의 빈번한 시작은 특히 많은 양의 데이터를 다룰 때 성능에 영향을 줄 수 있습니다.

요약

Popen 은 PHP의 강력한 도구로 외부 프로세스와 상호 작용하고 출력 또는 입력 데이터를 얻을 수 있습니다. 다른 모드를 사용하면 입력 및 출력 작업을 동시에 유연하게 읽고, 쓰기 및 수행 할 수도 있습니다. 실제 응용 프로그램에서는 외부 명령을 실행하고 네트워크 요청을하며 다른 프로그램과 의사 소통하는 데 특히 적합합니다.