programing

PHP exec() vs system() vs 패스스루()

newsource 2022. 9. 29. 00:57

PHP exec() vs system() vs 패스스루()

어떤 차이가 있을까?

각 기능에 대해 특정 상황 또는 이유가 있습니까?만약 그렇다면, 그러한 상황의 예를 몇 가지 들어주시겠습니까?

PHP.net 에서는 외부 프로그램을 실행하기 위해 사용된다고 합니다.참조: 제가 본 예시를 보면 뚜렷한 차이가 없습니다.

단순히 스크립트(bash 또는 python)를 실행하는 경우, 어떤 기능을 사용하는 것이 좋습니까?

그들은 목적이 약간 다르다.

  • exec() 는 시스템 명령어를 호출하기 위한 것입니다.또한 출력을 직접 처리할 수도 있습니다.
  • system() 는 시스템 명령어를 실행하여 출력(아마 텍스트)을 즉시 표시하기 위한 것입니다.
  • passthru() raw return을 원하는 시스템명령어를 실행하기 위한 것입니다(아마 바이너리일 것입니다).

어쨌든 어떤 것도 사용하지 않는 것이 좋습니다.모두 휴대하기 어려운 코드를 생성합니다.

http://php.net/ & Chipmunkninja에서 인용한 내용:

system() 함수

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

exec() 함수

시스템 기능은 매우 유용하고 강력하지만, 가장 큰 문제 중 하나는 프로그램의 모든 결과 텍스트가 출력 스트림으로 직접 전송된다는 것입니다.결과 텍스트의 형식을 지정하여 다른 방법으로 표시하거나 아예 표시하지 않는 경우가 있습니다.

이를 위해 PHP의 exec 함수는 완벽하게 적응되어 있습니다.실행 중인 프로그램에 의해 생성된 모든 텍스트를 출력 스트림에 자동으로 덤프하는 대신 이 텍스트를 함수의 두 번째 파라미터로 반환된 배열에 넣을 수 있습니다.

shell_exec() 함수

지금까지 실시해 온 프로그램의 대부분은, 거의 실제의 프로그램 1이었습니다.다만, 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"을 추가합니다.
  • 문제 문자를 포함할 수 있는 명령 인수를 이스케이프하려면 excapehellcmd()를 사용합니다.
  • 출력을 저장하기 위해 $output 변수를 exec()에 전달한 경우 $output이 비어 있지 않으면 새 출력이 exec()에 추가됩니다.따라서 먼저 설정 해제($output)가 필요할 수 있습니다.

이 모든 것은 명령어가 반환할 수 있는 출력 처리 방법 및 PHP 스크립트가 착신측 프로그램이 완료될 때까지 기다릴지 여부에 따라 결정됩니다.

  • exec는 명령어를 실행하여 발신자에게 출력을 전달합니다(또는 임의변수로 반환).

  • passthru와 유사합니다.exec()명령어를 실행한다는 점에서 기능합니다.이 기능은 다음 대신 사용해야 합니다.exec()또는system()Unix 명령어의 출력이 브라우저에 직접 반환해야 하는 바이너리 데이터인 경우.

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

명령어를 실행하여 명령어의 모든 데이터를 간섭 없이 직접 반환해야 하는 경우passthru()기능.

명령줄에서 PHP 스크립트를 실행하는 경우passthru()한 가지 큰 이점이 있습니다.다음과 같은 스크립트/프로그램을 실행할 수 있습니다.vim,dialog, 등, 이러한 프로그램이 제어를 처리하도록 하고, 종료했을 때만 스크립트로 돌아옵니다.

사용하시는 경우system()또는exec()이러한 스크립트/프로세서를 실행하는 것은, 간단하게는 동작하지 않습니다.

Gotcha: 어떤 이유에선지 실행할 수 없습니다.less와 함께passthru()PHP로 설정합니다.

언급URL : https://stackoverflow.com/questions/732832/php-exec-vs-system-vs-passthru