[php] PHP exec () vs 시스템 () vs passthru ()

차이점은 무엇입니까?

각 기능에 특정한 상황이나 이유가 있습니까? 그렇다면 그러한 상황에 대한 몇 가지 예를 들어 줄 수 있습니까?

PHP.net은 외부 프로그램을 실행하는 데 사용된다고 말합니다. 참조 참조
내가 본 예제에서 명백한 차이는 보이지 않습니다.

단순히 스크립트 (bash 또는 python)를 실행하려는 경우 어떤 기능을 사용하도록 권장합니까?



답변

목적이 약간 다릅니다.

  • exec() 시스템 명령을 호출하고 출력을 직접 처리하기위한 것입니다.
  • system() 시스템 명령을 실행하고 출력, 즉 텍스트를 즉시 표시하기위한 것입니다.
  • passthru() 원시 리턴을 원하는 시스템 명령을 실행하는 것입니다. 아마도 이진입니다.

어쨌든, 나는 당신이 그들을 사용하지 않는 것이 좋습니다. 그것들은 모두 이식 불가능한 코드를 생성합니다.


답변

http://php.net/ && Chipmunkninja 에서 가져온 것처럼 :

시스템 () 함수

PHP의 시스템 함수는 실행할 명령과 해당 명령에 전달할 인수와 함께 문자열 인수를 사용합니다. 이 함수는 지정된 명령을 실행하고 결과 텍스트를 출력 스트림 (웹 서버 상황의 HTTP 출력 또는 명령 줄 도구로 PHP를 실행중인 경우 콘솔)에 덤프합니다. 이 함수의 반환은 텍스트 출력을내는 경우 프로그램의 마지막 출력 줄입니다.

간부 () 함수

시스템 기능은 매우 유용하고 강력하지만 가장 큰 문제 중 하나는 프로그램의 모든 결과 텍스트가 출력 스트림으로 직접 이동한다는 것입니다. 결과 텍스트를 형식화하여 다른 방식으로 표시하거나 전혀 표시하지 않는 상황이 있습니다.

이를 위해 PHP의 exec 함수는 완벽하게 조정되었습니다. 실행중인 프로그램에서 생성 된 모든 텍스트를 출력 스트림에 자동으로 덤프하는 대신이 텍스트를 두 번째 매개 변수로 리턴 된 배열에 함수에 넣을 수 있습니다.

shell_exec () 함수

지금까지 우리가 수행 한 대부분의 프로그램은 실제 프로그램이었습니다. 그러나 Windows 및 Unix 사용자가 운영하는 환경은 실제로 이보다 훨씬 풍부합니다. Windows 사용자는 Windows 명령 프롬프트 프로그램 인 cmd.exe를 사용할 수 있습니다.이 프로그램을 명령 쉘이라고합니다.

경유 () 함수

PHP가 우리가 지금까지 본 것과 유사한 기능을 제공하는 한 가지 흥미로운 기능은 경유 기능입니다. 이 기능은 다른 기능과 마찬가지로 사용자에게 알려주는 프로그램을 실행합니다. 그러나이 프로그램의 원시 출력을 PHP가 현재 작동중인 출력 스트림 (웹 서버 시나리오의 HTTP 또는 PHP의 명령 행 버전의 쉘)으로 즉시 보냅니다.

proc_open () 함수와 는 popen ()
함수

proc_open ()은 popen ()과 비슷하지만 프로그램 실행에 대해 훨씬 더 많은 제어를 제공합니다. cmd는 셸에서 실행되는 명령입니다. descriptorspec은 키가 디스크립터 번호를 나타내며 값이 PHP가 해당 디스크립터를 하위 프로세스로 전달하는 방법을 나타내는 인덱스 배열입니다. 파이프는 생성 된 파이프의 PHP 끝에 해당하는 파일 포인터의 인덱스 배열로 설정됩니다. 리턴 값은 프로세스를 나타내는 자원입니다. 완료되면 proc_close ()를 사용하여 해제해야합니다.


답변

이전 답변은 모두 약간 혼란 스럽거나 불완전한 것으로 보이므로 차이점에 대한 표는 다음과 같습니다.

+----------------+-----------------+----------------+----------------+
|    Command     | Displays Output | Can Get Output | Gets Exit Code |
+----------------+-----------------+----------------+----------------+
| system()       | Yes (as text)   | Last line only | Yes            |
| passthru()     | Yes (raw)       | No             | Yes            |
| exec()         | No              | Yes (array)    | Yes            |
| shell_exec()   | No              | Yes (string)   | No             |
| backticks (``) | No              | Yes (string)   | No             |
+----------------+-----------------+----------------+----------------+
  • “출력 표시”는 출력을 브라우저 (또는 명령 행에서 실행하는 경우 명령 행 출력)로 스트리밍하는 것을 의미합니다.
  • “Can Get Output”은 명령의 출력을 가져 와서 PHP 변수에 할당 할 수 있음을 의미합니다.
  • “종료 코드”는 명령에 의해 리턴 된 특수 값입니다 ( “반환 상태”라고도 함). 0은 일반적으로 성공했음을 의미하고 다른 값은 일반적으로 오류 코드입니다.

알아야 할 기타 사항 :

  • shell_exec ()와 backticks 연산자는 같은 일을합니다.
  • proc_open () 및 popen ()도 실행 명령을 사용하여 대화식으로 스트림을 읽고 쓸 수 있습니다.
  • 오류 메시지를 캡처 / 표시하려면 명령 문자열에 “2> & 1″을 추가하십시오.
  • escapeshellcmd ()를 사용하여 문제가있는 명령 인수를 이스케이프하십시오.
  • 출력을 저장하기 위해 $ output 변수를 exec ()에 전달하면 $ output이 비어 있지 않으면 새 출력이 추가됩니다. 따라서 먼저 설정을 해제 ($ output)해야 할 수도 있습니다.

답변

실제로는 명령이 반환 할 수있는 출력을 처리하는 방법과 PHP 스크립트가 수신자 프로그램이 끝날 때까지 기다리는 지 여부에 달려 있습니다.

  • exec 명령을 실행하고 호출자에게 출력을 전달합니다 (또는 선택적 변수로 반환).

  • passthruexec()명령을 실행한다는 점 에서 함수 와 유사합니다 . 이 함수는 Unix 명령의 출력이 이진 데이터이므로 브라우저로 직접 전달해야하는 경우 exec()또는 대신 사용되어야 system()합니다.

  • system 외부 프로그램을 실행하고 출력을 표시하지만 마지막 행만 표시합니다.

명령을 실행해야하고 명령의 모든 데이터가 간섭없이 직접 전달되도록하려면이 passthru()기능을 사용하십시오 .


답변

명령 행에서 PHP 스크립트를 실행하는 경우 passthru()큰 이점이 있습니다. 그것은 당신이 같은 스크립트 / 프로그램을 실행하게됩니다 vim, dialog등, 이러한 프로그램 핸들 제어셔서 그들이 할 경우에만 스크립트로 돌아.

해당 스크립트 / 프로그램 을 사용 system()하거나 exec()실행하면 작동하지 않습니다.

잡았다 : 어떤 이유로, 당신은 실행할 수 없습니다 lesspassthru()PHP한다.


답변