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

有什么不同?

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

net说它们是用来执行外部程序的。见参考 从我所看到的例子中,我没有看到任何明显的区别

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

297432 次浏览

它们的目的略有不同。

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

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

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

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

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

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

如果你需要执行一个命令,并让该命令的所有数据直接传回而不受任何干扰,可以使用passthru()函数。

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

如果你使用system()exec()来执行这些脚本/程序,它根本不会工作。

因为某些原因,你不能在PHP中用passthru()执行less

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

系统()函数

PHP中的系统函数以一个字符串参数作为to命令的参数 执行您希望传递给该命令的任何参数。这 函数执行指定的命令,并转储任何结果文本 到输出流(web服务器中的HTTP输出) 如果您将PHP作为命令行运行,则可以访问控制台 工具)。函数的返回值是输出的最后一行

.程序,如果它发出文本输出

exec()函数

系统的功能是相当有用和强大的,但其中之一 它最大的问题是程序产生的所有文本 直接转到输出流。有些情况下你会 可能想格式化结果文本,并显示在一些 不同的方式,或者根本不显示它 为此,PHP中的exec函数是完美的适应。而不是 自动转储由正在执行的程序生成的所有文本 对于输出流,它为您提供了将文本放入其中的机会 函数的第二个参数中返回的数组:

shell_exec()函数

到目前为止,我们执行的大多数程序都是 或者更少,真正的程序。但是,Windows所处的环境和 Unix用户的操作实际上比这丰富得多。Windows用户 是否可以选择使用Windows命令提示符程序cmd.exe 这个程序被称为命令shell

passthru()函数

PHP提供的一个有趣的函数,类似于我们的函数 到目前为止看到的是passthru函数。这个函数,和其他函数一样, 执行您让它执行的程序。然而,它接着继续 立即将该程序的原始输出发送到输出流 PHP当前工作(即web服务器中的HTTP)

. PHP命令行版本的shell)

proc_open ()函数和popen() 函数< /强> < / p >

proc_open()类似于popen(),但提供了更大的程度 对程序执行的控制。CMD是要执行的命令 由shell执行。描述规范是一个索引数组,其中 key表示描述符数,value表示PHP如何使用 将该描述符传递给子进程。管道将被设置为 一个文件指针的索引数组,对应于PHP的any结尾 创建的管道。返回值是一个资源表示 的过程;你应该使用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()和反勾运算符做同样的事情。
  • 还有proc_open()和popen(),它们允许你用执行命令交互地读/写流。
  • 如果还想捕获/显示错误消息,则在命令字符串中添加“2>&1”。
  • 使用escapeshellcmd()转义可能包含问题字符的命令参数。
  • 如果将$output变量传递给exec()以存储输出,如果$output不为空,则将新的输出附加到它。所以你可能需要先unset($output)。