PHP的 – exec()vs系统()vs passthru()

有什么区别?

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

PHP.net说,它们被用来执行外部程序。 看到参考从我看到的例子,我没有看到任何明显的差异。

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

他们的目的略有不同。

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

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

system()函数

PHP中的系统函数需要一个字符串参数,以及要传递给该命令的任何参数。 此函数执行指定的命令,并将所得到的文本转储到输出流(Web服务器情况下的HTTP输出,或者作为命令行工具运行PHP的控制台)。 这个函数的返回值是程序输出的最后一行,如果它发出文本输出的话。

exec()函数

系统功能非常有用且功能强大,但其中最大的问题之一是程序中产生的所有文本都会直接输出到输出流。 在某些情况下,您可能想要格式化所得到的文本并以不同的方式显示,或者根本不显示。

为此,PHP中的exec函数完全适应。 而不是自动将正在执行的程序生成的所有文本转储到输出流中,而是让您有机会将此文本放入第二个参数返回的数组中:

shell_exec()函数

我们迄今为止执行的大多数方案都或多或少都是真正的方案1。 但是,Windows和Unix用户的操作环境实际上要比这更加丰富。 Windows用户可以选择使用Windows命令提示符程序cmd.exe该程序被称为命令shell。

passthru()函数

PHP提供的一个非常吸引人的功能就是passthru功能。 这个功能和其他的一样,执行你告诉它的程序。 但是,它会继续立即将此程序的原始输出发送到PHP正在使用的输出流(即Web服务器方案中的HTTP或PHP命令行版本中的外壳程序)。

proc_open()函数和popen()函数

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

积分: http : //php.net/ && Chipmunkninja(链接不提,因为它不工作,404错误)

以前的回答似乎都有点混乱或不完整,所以这里是一个差异表格。

 +----------------+-----------------+----------------+----------------+ | 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不是空的,它会将新的输出附加到它。 所以你可能需要首先取消设置($输出)。

这完全取决于你想如何处理命令可能返回的输出,以及是否希望PHP脚本等待被调用程序完成。

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

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

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

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

如果从命令行运行PHP脚本, passthru()有一个很大的好处。 它可以让你执行脚本/程序,比如vimdialog等,让这些程序处理控制权并且只有在它们完成时才返回你的脚本。

如果你使用system()或者exec()来执行这些脚本/程序,那么它根本行不通。

陷阱:出于某种原因,你不能用passthru()在PHP中执行less