php system linux passthru



PHP exec() vs system() vs passthru() (5)

Quais são as diferenças?

Existe uma situação ou razão específica para cada função? Se sim, você pode dar alguns exemplos dessas situações?

PHP.net diz que eles são usados ​​para executar programas externos. ver referência A partir dos exemplos que vejo, não vejo nenhuma diferença óbvia.

Se eu fosse simplesmente executar um script (bash ou python), qual função você recomenda que eu use?

https://src-bin.com


Answer #1

A resposta anterior parecia ser um pouco confusa ou incompleta, então aqui está uma tabela das diferenças ...

+----------------+-----------------+----------------+----------------+
|    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             |
+----------------+-----------------+----------------+----------------+
  • "Exibe a Saída" significa que ela transmite a saída para o navegador (ou saída da linha de comando, se estiver executando a partir de uma linha de comando).
  • "Can Get Output" significa que você pode obter a saída do comando e atribuí-lo a uma variável PHP.
  • O "código de saída" é um valor especial retornado pelo comando (também chamado de "status de retorno"). Zero geralmente significa que foi bem-sucedido e outros valores geralmente são códigos de erro.

Outras coisas importantes para estar ciente:

  • O shell_exec () e o operador de backticks fazem a mesma coisa.
  • Existem também proc_open () e popen () que permitem a leitura / gravação interativa de streams com um comando em execução.
  • Adicione "2> & 1" à cadeia de comando se você também quiser capturar / exibir mensagens de erro.
  • Use escapeshellcmd () para escapar dos argumentos de comando que podem conter caracteres do problema.
  • Se passar uma variável $ output para exec () para armazenar a saída, se a saída $ não estiver vazia, ela anexará a nova saída a ela. Então você pode precisar desmarcar ($ output) primeiro.

Answer #2

Como desenhado em http://php.net/ && Chipmunkninja :

A função system()

A função do sistema em PHP recebe um argumento de string com o comando para executar, bem como quaisquer argumentos que você deseja passar para esse comando. Essa função executa o comando especificado e copia qualquer texto resultante para o fluxo de saída (a saída HTTP em uma situação do servidor da Web ou o console, se você estiver executando o PHP como uma ferramenta de linha de comandos). O retorno desta função é a última linha de saída do programa, se ela emitir saída de texto.

A função exec ()

A função do sistema é bastante útil e poderosa, mas um dos maiores problemas é que todo o texto resultante do programa vai diretamente para o fluxo de saída. Haverá situações em que você pode querer formatar o texto resultante e exibi-lo de alguma maneira diferente, ou não exibi-lo.

Para isso, a função exec em PHP é perfeitamente adaptada. Em vez de descarregar automaticamente todo o texto gerado pelo programa que está sendo executado no fluxo de saída, ele oferece a oportunidade de colocar esse texto em uma matriz retornada no segundo parâmetro para a função:

A função shell_exec()

A maioria dos programas que temos executado até agora tem sido, mais ou menos, programas reais1. No entanto, o ambiente em que os usuários do Windows e do Unix operam é realmente muito mais rico do que isso. Os usuários do Windows têm a opção de usar o programa Prompt de Comando do Windows, cmd.exe. Esse programa é conhecido como shell de comando.

A função passthru()

Uma função fascinante que o PHP fornece similar àquelas que vimos até agora é a função passthru. Esta função, como as outras, executa o programa para o qual você diz. No entanto, ele passa a enviar imediatamente a saída bruta desse programa para o fluxo de saída com o qual o PHP está atualmente trabalhando (por exemplo, HTTP em um cenário de servidor da Web ou o shell em uma versão de linha de comando do PHP).

A função proc_open() e a função popen()

proc_open () é semelhante a popen (), mas fornece um grau muito maior de controle sobre a execução do programa. cmd é o comando a ser executado pelo shell. descriptorspec é uma matriz indexada onde a chave representa o número do descritor e o valor representa como o PHP passará esse descritor para o processo filho. pipes serão configurados para uma matriz indexada de ponteiros de arquivos que correspondem ao final de qualquer pipe criado pelo PHP. O valor de retorno é um recurso que representa o processo; você deve liberá-lo usando proc_close () quando tiver terminado.


Answer #3

Eles têm propósitos ligeiramente diferentes.

  • exec() é para chamar um comando do sistema e, talvez, lidar com a saída.
  • system() é para executar um comando do sistema e exibir imediatamente a saída - presumivelmente texto.
  • passthru() é para executar um comando do sistema do qual você deseja o retorno bruto - presumivelmente algo binário.

Independentemente disso, sugiro que você não use nenhum deles. Todos eles produzem código altamente não portável.


Answer #4

Se você estiver executando seu script PHP a partir da linha de comando, o passthru() tem um grande benefício. Ele permitirá que você execute scripts / programas como o vim , o dialog , etc, permitindo que esses programas controlem o controle e retornem ao seu script somente quando estiverem prontos.

Se você usar system() ou exec() para executar esses scripts / programas, simplesmente não funcionará.

Gotcha: Por algum motivo, você não pode executar less com passthru() no PHP.


Answer #5

Tudo se resume a como você deseja lidar com a saída que o comando pode retornar e se deseja que seu script PHP aguarde o término ou não do programa chamado.

  • exec executa um comando e passa a saída ao responsável pela chamada (ou a retorna em uma variável opcional).

  • passthru é semelhante à função exec() , na medida em que executa um comando. Esta função deve ser usada no lugar de exec() ou system() quando a saída do comando Unix é dados binários que precisam ser passados ​​diretamente de volta para o navegador.

  • system executa um programa externo e exibe a saída, mas somente a última linha.

Se você precisar executar um comando e tiver todos os dados do comando transmitidos diretamente de volta sem qualquer interferência, use a função passthru() .





exec