PHP exec () vs 시스템 () vs passthru ()


312

차이점은 무엇입니까?

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

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

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


16
이이기도 proc_open()하고 popen()스폰 공정 제어의 높은 수준을 허용 둘.
기독교

답변:


195

목적이 약간 다릅니다.

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

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


147
기능성을 위해 이식성을 희생해야하는 경우가 있습니다. PHP가 잘 할 수없는 일이 있습니다.
Frank Crook

30
@ 칼 리움 : 당신의 진술에 대해 더 자세히 설명해 주시겠습니까? 일부 모호한 비율 통계 만 언급해도 설득력이 없습니다. 전체 응용 프로그램이 백엔드의 여러 스크립트에 의존하지 않는 한 시스템 호출을 사용하여 스크립트를 실행하는 것이 좋습니다.
codingbear 2009

46
@Christian izkata@izein:~$ dir -bash: dir: command not found-FreeBSD
Izkata

5
@OZ_ 나는 매우 비싼 계산을해야하는 상황에 왔습니다. PHP 모듈이 없었습니다. 나는 내 자신의 C 프로그램을 작성했고 passthru ()로 호출했다. 때로는 이식성이 다른 것보다 덜 중요 할 수 있습니다. 프로젝트에 따라 다릅니다.
Paolo

9
또한, 그것은의 착오 는 피하기로 PHP 오랫동안 같은 휴대용이라고 생각하는 exec, system, passthru. PHP 코드는 실행되는 환경에 의존하며 많은 보안 버그는 이것을 고려하지 않았기 때문에 발생합니다. 다음은 간단한 예입니다 : stackoverflow.com/questions/3003145/…
Pacerier

131

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 ()를 사용하여 해제해야합니다.


6
shell_exec 실행 속도가 다른 대체 속도보다 빠릅니다.
Dinesh Saini

29
ChipmunkNinja 에서 직접 답변을 복사했다고 언급해야합니다 .
TachyonVortex

7
@TachyonVortex는 다행히 ChipmunkNinja가 더 이상 존재하지 않기 때문에 답을 그대로 복사했습니다.
Phileo99

2
웨이 백 머신에서 그 기사의 사본이있다 : web.archive.org/web/20130809032648/http://chipmunkninja.com/...
bagonyi

2
popen과 proc_open은 어떻습니까?
CMCDragonkai

103

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

+----------------+-----------------+----------------+----------------+
|    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 파일을 실행할 수 있습니까?
johny 왜

1
@ johnywhy 자체가 없음-PHP cli 등을 명시 적으로 호출하지 않는 한. 나는 당신이 원하는 가정 include친구
하겐 폰 Eitzen

21

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

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

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

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

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


8

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

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

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


1
나는 당신이 무슨 말을하는지 이해하지 못합니다. CLI 및 (F) CGI (mod_php)에서 프로그램을 실행할 수 있습니다. selinux와 같은 시스템 제한 사항이있을 수 있습니다. 그러나 잘 설정된 시스템은 선택적으로 꺼지게됩니다. 물론 공유 호스트는 다른 이야기이지만 존경하는 고객에게 공유 환경을 제공 하지는 않습니까?
기독교
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.