Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP exec()vs system()vs passthru())_Php_Command_Exec - Fatal编程技术网

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

PHP exec()vs system()vs passthru()),php,command,exec,Php,Command,Exec,有什么区别 每个功能是否有特定的情况或原因?如果是,你能举一些例子说明这些情况吗 PHP.net说它们用于执行外部程序。 从我看到的例子中,我没有看到任何明显的区别 如果我只是运行一个脚本(bash或python),您建议我使用哪个函数?它们的用途略有不同 用于调用一个系统命令,也许还可以自己处理输出 用于执行系统命令并立即显示输出(可能是文本) 用于执行您希望原始返回的系统命令-可能是二进制的 无论如何,我建议你不要使用任何一种。它们都会产生高度不可移植的代码。实际上,这一切都取决于您希望

有什么区别

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

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


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

它们的用途略有不同

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

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

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

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

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

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


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

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

如果您使用
system()
exec()
来执行这些脚本/程序,那么它根本不起作用

明白了:由于某些原因,您无法在PHP中使用
passthru()
执行
less

如&&&

功能

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

功能

系统功能非常有用和强大,但是 它最大的问题是所有的结果文本都来自程序 直接转到输出流。在某些情况下,你会 您可能希望格式化生成的文本并以某种方式显示它 不同的方式,或者根本不显示它

为此,PHP中的exec函数进行了完美的调整。而不是 自动转储正在执行的程序生成的所有文本 对于输出流,它为您提供了将此文本放入的机会 在函数的第二个参数中返回的数组:

功能

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

功能

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

函数和 功能

proc_open()与popen()类似,但提供了更高的级别 对程序执行的控制。cmd是要执行的命令 由shell执行。descriptorspec是一个索引数组,其中 键表示描述符编号,值表示PHP 将该描述符传递给子进程。管道将设置为 文件指针的索引数组,对应于PHP的任何 创建的管道。返回值是表示 过程;当您需要时,应该使用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             |
+----------------+-----------------+----------------+----------------+
  • “显示输出”表示它将输出流式传输到浏览器(如果从命令行运行,则为命令行输出)
  • “cangetoutput”意味着您可以获取命令的输出并将其分配给PHP变量
  • “退出代码”是命令返回的特殊值(也称为“返回状态”)。零通常表示成功,其他值通常是错误代码
其他需要注意的事项:

  • shell_exec()和backticks操作符执行相同的操作
  • 还有proc_open()和popen(),允许您通过执行命令以交互方式读/写流
  • 如果还希望捕获/显示错误消息,请将“2>&1”添加到命令字符串中
  • 使用escapeshellcmd()转义可能包含问题字符的命令参数
  • 如果通过$outpu