PHP에서 Popen은 프로세스 데이터와 상호 작용할 수 있도록 프로세스의 입력 및 출력 스트림을 열는 데 사용할 수있는 매우 유용한 기능입니다. 이 기능은 외부 명령을 실행하고 외부 프로그램 호출, 스크립트 실행 또는 다른 시스템과 상호 작용하는 등 출력을 가져와야 할 때 종종 유용합니다.
Popen 함수는 프로세스를 열고 프로세스의 입력 또는 출력 스트림에 대한 파일 포인터를 반환하는 데 사용됩니다. 이 기능에는 두 가지 매개 변수가 있습니다.
resource popen(string $command, string $mode);
$ 명령 : 실행되는 명령은 일반적으로 쉘 명령입니다.
$ 모드 : 작동 모드, R은 읽기 모드를 나타내고 W는 쓰기 모드를 나타내고 R+는 읽기 및 쓰기 모드를 나타냅니다.
예를 들어:
$handle = popen("ls -l", "r");
위의 코드는 프로세스를 열고 LS -L 명령을 실행하며 프로세스의 출력을 읽을 수 있습니다.
Popen 의 반환 값은 파일과 같이 데이터를 읽거나 쓸 수있는 파일 포인터입니다. 프로세스와 상호 작용할 때 일반적으로 Fread 또는 FGES를 사용하여 프로세스의 출력 스트림에서 데이터를 읽거나 Fwrite를 사용하여 프로세스 입력 스트림에 데이터를 작성해야합니다.
외부 명령에서 데이터를 가져 와서 처리하려고한다고 가정하면 코드 예제는 다음과 같습니다.
$handle = popen("ls -l", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
echo $line;
}
fclose($handle);
} else {
echo "프로세스를 열 수 없습니다";
}
여기서, 우리는 더 이상 출력이 없을 때까지 프로세스 출력의 각 라인을 읽기 위해 FGET를 통과합니다.
프로세스의 표준 입력 스트림에 데이터를 작성 해야하는 경우 Popen 의 W 모드를 통해 수행 할 수 있습니다.
$handle = popen("sort", "w");
if ($handle) {
fwrite($handle, "banana\napple\ncherry\n");
fclose($handle);
} else {
echo "프로세스를 열 수 없습니다";
}
위의 코드는 정렬 명령을 시작하고 표준 입력 스트림에 데이터를 씁니다. 정렬은 이 데이터를 정렬합니다.
동시에 데이터를 읽고 작성 해야하는 경우 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을 통해 네트워크 관련 명령을 실행해야 할 수도 있습니다. 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을 요청하고 반환 된 컨텐츠를 한 줄씩 출력합니다.
프로세스 수명주기 : POPEN 이 시작한 프로세스는 PHP 스크립트가 실행 된 후 자동으로 닫힙니다. 자원의 올바른 릴리스를 보장하려면 스크립트가 끝나기 전에 FCLOSE를 호출하여 파일 포인터를 닫습니다.
보안 : Popen을 사용할 때주의하십시오. 수신 명령 또는 매개 변수가 악의적 인 사용자에 의해 조작되지 않도록하고 명령의 일부로 사용자 입력을 직접 사용하지 않도록하십시오.
성능 : Popen은 프로세스 간 통신을 촉진 할 수 있지만 외부 프로세스의 빈번한 시작은 특히 많은 양의 데이터를 다룰 때 성능에 영향을 줄 수 있습니다.
Popen 은 PHP의 강력한 도구로 외부 프로세스와 상호 작용하고 출력 또는 입력 데이터를 얻을 수 있습니다. 다른 모드를 사용하면 입력 및 출력 작업을 동시에 유연하게 읽고, 쓰기 및 수행 할 수도 있습니다. 실제 응용 프로그램에서는 외부 명령을 실행하고 네트워크 요청을하며 다른 프로그램과 의사 소통하는 데 특히 적합합니다.