Answers:
它们的用途略有不同。
exec()
用于调用系统命令,并可能自己处理输出。 system()
用于执行系统命令并立即显示输出-大概是文本。 passthru()
用于执行您希望从中返回原始值的系统命令-大概是二进制文件。无论如何,我建议您不要使用其中任何一个。它们都产生高度不可移植的代码。
izkata@izein:~$ dir -bash: dir: command not found
-FreeBSD
exec
,system
,passthru
。PHP代码依赖于其运行的环境,并且许多安全性错误是由于未考虑到这一点。这里有一个简单的例子:stackoverflow.com/questions/3003145/...
如从http://php.net/ && Chipmunkninja绘制 :
该系统()函数
PHP中的系统函数需要一个字符串参数和要执行的命令,以及希望传递给该命令的所有参数。此函数执行指定的命令,并将所有结果文本转储到输出流(Web服务器情况下为HTTP输出,或者如果您将PHP作为命令行工具运行则为控制台)。如果该函数发出文本输出,则该函数的返回是程序输出的最后一行。
在EXEC()函数
系统功能非常有用且功能强大,但是最大的问题之一是程序中产生的所有文本都直接进入输出流。在某些情况下,您可能希望格式化结果文本并以某种不同的方式显示它,或者根本不显示它。
为此,PHP中的exec函数已完美适应。与其自动将正在执行的程序所生成的所有文本自动转储到输出流,不如让您有机会将这些文本放入函数的第二个参数返回的数组中:
到目前为止,我们执行的大多数程序或多或少都是真实程序1。但是,Windows和Unix用户的操作环境实际上比这要丰富得多。Windows用户可以选择使用Windows命令提示符程序cmd.exe,此程序称为命令外壳程序。
该中继()函数
PHP提供的一种引人入胜的功能类似于到目前为止所见的功能,即passthru函数。与其他函数一样,该函数执行您告诉它的程序。但是,它随后继续将来自该程序的原始输出立即发送到PHP当前正在使用的输出流(即,Web服务器方案中的HTTP或PHP命令行版本中的Shell)。
的proc_open()函数和POPEN() 函数
proc_open()与popen()类似,但提供了对程序执行的更大程度的控制。cmd是要由外壳执行的命令。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 |
+----------------+-----------------+----------------+----------------+
其他需要注意的杂项:
include
和朋友
如果您从命令行运行PHP脚本,则passthru()
有一个很大的好处。它可以让你执行脚本/程序,如vim
,dialog
等,让这些程序处理控制并返回到你的脚本,只有当他们这样做。
如果您使用system()
或exec()
执行那些脚本/程序,它将根本无法工作。
疑难杂症:出于某种原因,你不能执行less
与passthru()
在PHP。
proc_open()
和popen()
,两者都允许对生成的过程进行更高程度的控制。