system()
string system (string command [, int return_var])
system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。(system和exec的区别在于system在执行系统外部命令时,直接将结果输出到浏览器,不需要使用 echo 或 return 来查看结果,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样)
??? 返回结果
??????? 成功返回0,
??????? 失败(命令不存在等原因) ? 返回 ? 非0值
exec()
原型:string exec (string command [, string array [, int return_var]])
exec ()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码。(exec 执行系统外部命令时不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0) 例子:
exec("/bin/ls -l");
exec("/bin/ls -l", $res);
exec("/bin/ls -l", $res, $rc);
passthru
passthru与system的区别,passthru直接将结果输出到浏览器,不需要使用 echo 或 return 来查看结果,不返回任何值,且其可以输出二进制,比如图像数据。
popen
exec/system/passthru函数实际上都是调用VCWD_POPEN去执行命令,exec/system/passthru之间的区别我不感兴趣,我感兴趣的是popen和他们三的区别:
1.popen的mode参数是可以手动设置的"r"/"w",另外三只能是"r"(windows下是"rb")
2.popen没有读取和关闭管道,另外三是立即读取管道然后关闭管道
所以popen不会等待程序执行完成,而另外三必须等程序执行完成(推向后台的程序除外)。那如果popen打开了一个推向后台(mycmd &)的程序,然后又没有重定向stdout/stderr,那么当mycmd产生输出的时候,也就是想管道写入的时候,php引擎会收到SIGPIPE信号,然后中断程序,简单的说就是:程序在写一个读端被关闭的管道,会产生SIGPIPE信号。如果没推向后端,php会等待他调用的系统popen打开的命令返回才能收工,所以会卡在pclose或者没有pclose就在你的程序最后。