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

Quais são as diferenças?

Existe uma situação específica ou razão para cada função? Em caso afirmativo, pode dar alguns exemplos dessas situações?

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

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

Author: jww, 2009-04-09

5 answers

Têm objectivos ligeiramente diferentes.

  • {[[0]} é para chamar um comando de sistema, e talvez lidar com a saída você mesmo.
  • system() é para executar um comando do sistema e mostrar imediatamente o resultado-presumivelmente texto.
  • {[[2]} é para executar um comando do sistema de que deseja o retorno bruto-presumivelmente algo binário.
De qualquer forma, sugiro que não use nenhum deles. Todos eles produzem código altamente importável.
 171
Author: Kalium, 2017-07-27 05:49:37

Tal como desenhado em http://php.net/ && Chipmunkninja:

A função do sistema()

A função do sistema em PHP leva um argumento de texto com o comando para execute, bem como quaisquer argumentos que deseje passar para esse comando. Presente a função executa o comando indicado e descarrega qualquer texto resultante para a transmissão de saída (tanto a saída de HTTP num servidor web situação, ou a consola se você estiver executando PHP como um comando ferramenta). O retorno desta função é a última linha de saída do programa, se emitir texto de saída.

A função exec ()

A função do sistema é bastante útil e poderosa, mas uma das os maiores problemas com ele é que todo o texto resultante do programa vai directamente para o fluxo de saída. Haverá situações em que pode querer formatar o texto resultante e mostrá-lo em alguns de outra forma, ou não. mostra-o de todo.

Para isto, a função exec em PHP está perfeitamente adaptada. Em vez de despejar automaticamente todo o texto gerado pelo programa em execução para o fluxo de saída, ele lhe dá a oportunidade de colocar este texto em um array retornado no segundo parâmetro para a função:

A função shell_exec ()

A maioria dos programas que temos executado até agora foram, mais ou menos, programas reais 1. No entanto, a ambiente em que as janelas e Os usuários do Unix operam na verdade é muito mais rico do que isso. Usuario tenha a opção de usar o programa de comandos do Windows, cmd.exe Este programa é conhecido como shell de comando.

A funçãopassthru ()

Uma função fascinante que o PHP fornece semelhante à que temos visto até agora é a função passthru. Esta função, como os outros, executa o programa para o qual o dizes. No entanto, prossegue para enviar imediatamente o resultado bruto deste programa para o fluxo de saída com o qual PHP está trabalhando atualmente (ou seja, HTTP em um servidor web scenario, ou a shell em uma versão de linha de comando do PHP).

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

Proc_open () é semelhante ao popen (), mas fornece um grau muito maior de controle sobre a execução do programa. o cmd é o comando a ser executado pela shell. descriptorspec é uma lista indexada onde o chave representa o número do descritor e o valor representa a forma como o PHP vai passar esse descritor para o processo infantil. os tubos serão regulados para um array indexado de ponteiros de arquivo que correspondem ao fim de PHP de qualquer tubos que são criados. O valor de retorno é um recurso que representa o processo; você deve liberá-lo usando proc_close() quando você está acabei com isso.

 107
Author: Dinesh Saini, 2018-05-07 16:57:43
A resposta anterior parecia 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             |
+----------------+-----------------+----------------+----------------+
  • "mostra o resultado" significa que transmite o resultado para o navegador (ou saída da linha de comandos se estiver a correr a partir de uma linha de comandos).
  • "pode obter Saída" significa que pode obter a saída do comando e atribuí-la a uma variável PHP.
  • o " código de saída "é um valor especial devolvido pelo comando (também chamado de"Estado de retorno"). Zero normalmente significa isso. foi bem sucedido e outros valores são geralmente códigos de erro.

Outras coisas diversas para estar ciente:

  • o shell_exec () e o operador backticks fazem a mesma coisa.
  • Existem também proc_open () e popen () que lhe permitem ler/escrever interactivamente fluxos com um comando de execução.
  • Adicione "2> & 1" ao texto do comando se também quiser capturar/mostrar mensagens de erro.
  • usar o escapeshellcmd () para escapar dos argumentos do comando que podem conter problemas caracter.
  • se passar uma variável $output para exec () para guardar a saída, se a $output não estiver vazia, irá adicionar a nova saída a ela. Por isso, você pode precisar de desativar($output) primeiro.
 66
Author: orrd, 2017-03-29 17:32:00

Tudo se resume a como você quer lidar com a saída que o comando pode retornar e se você quer que seu script PHP para esperar o programa de callee para terminar ou não.

  • exec executa um comando e passa a saída para o chamador (ou devolve-o numa variável opcional).

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

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

Se precisar de executar um comando e ter todos os dados do comando passados directamente sem qualquer interferência, use a função passthru().

 17
Author: Cody Caughlan, 2015-11-09 14:33:57
Se está a executar o seu programa de PHP a partir da linha de comandos, passthru()tem um grande benefício. Irá permitir-lhe executar programas/programas como vim, dialog, etc, deixando esses programas lidar com o controle e retornando ao seu script apenas quando eles são feitos.

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

Por alguma razão, não podes executar less com passthru() em PHP.
 5
Author: Matt, 2015-09-18 18:25:36