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

时间:2009-04-09 04:44:16

标签: php command exec

有什么区别?

每种功能都有特定的情况或原因吗?如果是的话,你能举一些这些情况的例子吗?

PHP.net说它们用于执行外部程序。 see reference 从我看到的例子中,我没有看到任何明显的区别。

如果我只是简单地运行一个脚本(bash或python),你建议我使用哪个函数?

5 个答案:

答案 0 :(得分:177)

他们的目的略有不同。

  • exec()用于调用系统命令,也许是自己处理输出。
  • system()用于执行系统命令并立即显示输出 - 可能是文本。
  • passthru()用于执行您希望原始返回的系统命令 - 可能是二进制文件。

无论如何,我建议你不要使用它们中的任何一个。它们都会产生高度不可移植的代码。

答案 1 :(得分:117)

摘自http://php.net/&& Chipmunkninja

  

system()功能

     

PHP中的系统函数使用命令to获取字符串参数   执行以及您希望传递给该命令的任何参数。这个   function执行指定的命令,并转储任何生成的文本   输出流(Web服务器中的HTTP输出)   情况,或者如果您将PHP作为命令行运行,则为控制台   工具)。此函数的返回是来自的最后一行输出   程序,如果它发出文本输出。

     

exec()功能

     

系统功能非常实用且功能强大,但却是其中之一   最大的问题是程序中产生的所有文本   直接进入输出流。会有你的情况   可能想格式化生成的文本并将其显示在某些文本中   不同的方式,或根本不显示它。

     

为此,PHP中的exec函数完全适应。代替   自动转储正在执行的程序生成的所有文本   在输出流中,它为您提供了放入此文本的机会   在函数的第二个参数中返回的数组:

     

shell_exec()功能

     

到目前为止,我们执行的大部分程序都是   或更少,真实的程序1。但是,Windows和Windows环境   Unix用户操作实际上比这更丰富。 Windows用户   可以选择使用Windows命令提示符程序cmd.exe   该程序称为命令shell。

     

passthru()功能

     

PHP提供的一个非常有趣的功能类似于我们拥有的功能   到目前为止看到的是passthru功能。这个功能和其他功能一样,   执行你告诉它的程序。然而,它继续进行   立即将此程序的原始输出发送到输出流   PHP当前正在使用(即Web服务器中的HTTP)   场景,或PHP的命令行版本中的shell。)

     

proc_open()函数和popen()   功能

     

proc_open()类似于popen(),但提供了更大的程度   控制程序执行。 cmd是命令   由shell执行。 descriptorspec是一个索引数组,其中   key表示描述符编号,值表示PHP的方式   将该描述符传递给子进程。管道将设置为   一个索引的文件指针数组,对应于PHP的任何结尾   创建的管道。返回值是表示的资源   过程;你应该使用proc_close()释放它   完成它。

答案 2 :(得分:76)

之前的回答似乎都有些令人困惑或不完整,所以这里有一个差异表......

+----------------+-----------------+----------------+----------------+
|    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             |
+----------------+-----------------+----------------+----------------+
  • "显示输出"表示它将输出流式传输到浏览器(如果从命令行运行,则输出命令行)。
  • "可以获得输出"意味着您可以获取命令的输出并将其分配给PHP变量。
  • "退出代码"是命令返回的特殊值(也称为"返回状态")。零通常意味着它是成功的,其他值通常是错误代码。

其他需要注意的事项:

  • shell_exec()和反引号运算符执行相同的操作。
  • 还有proc_open()和popen(),它们允许您使用执行命令以交互方式读/写流。
  • 添加" 2>& 1"如果您还想捕获/显示错误消息,请输入命令字符串。
  • 使用escapeshellcmd()来转义可能包含问题字符的命令参数。
  • 如果将$ output变量传递给exec()来存储输出,如果$ output不是空的,它会将新输出附加到它。所以你可能需要先取消设置($ output)。

答案 3 :(得分:17)

这真的归结为你想如何处理命令可能返回的输出以及你是否希望你的PHP脚本等待被调用者程序完成。

  • exec执行命令并将输出传递给调用者(或在可选变量中返回)。

  • passthru类似于exec()函数,因为它执行命令。当Unix命令的输出是需要直接传递回浏览器的二进制数据时,应该使用此函数代替exec()system()

  • system执行外部程序并显示输出,但只显示最后一行。

如果您需要执行命令并将命令中的所有数据直接传回而没有任何干扰,请使用passthru()功能。

答案 4 :(得分:5)

如果您从命令行运行PHP脚本,passthru()有一个很大的好处。它将允许您执行诸如vimdialog等脚本/程序,让这些程序只有在完成后才能处理控制并返回到脚本。

如果您使用system()exec()执行这些脚本/程序,它将无法正常工作。

Gotcha:出于某种原因,您无法在PHP中使用less执行passthru()