PHP执行系统命令 exec,system,passthru,popen
作者 斯人 | 发布于 2012 年 3 月 11 日
PHP PHP内核

PHP给给我们提供了三种内置函数 exec,system,passthru用来执行系统命令.
1. exec
exec(string $command[,array $out_put][,$ret_val]);
第一个参数是我们需要执行的命令,第二个参数是最后一条shell命令的结果.第三个参数是返回执行的状态,返回0 执行成功
例如:

<?php      
exec("/bin/ls",$arr,$retval); 
print_r($arr);      
echo $retval;    
?>

输出
Array
(
[0] => index.html
[1] => info.php
[2] => php.core
[3] => test.php
)
状态码:0
2.system
system(string $command[,int $ret_val);
第一个参数是我们执行的系统命令,第二个参数是状态,该函数会输出最后一条shell执行的结果

system("/bin/ls",$retval);
echo $retval;

输出结果

index.html
info.php
php.core
test.php
状态码 0;
3.passthru
passthru(string $command,$retval);
第一个参数系统执行的命令,第二个参数是状态码.
该函数不输出任何内容.

passthru("/bin/ls",$retval);
echo $retval;

结果 0;
4.popen
resource popen ( string $command , string $mode );
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
该函数返回一个管道句柄,可以用来读和写.
该管道可以用pclose来关闭.

$fp=popen("/bin/ls","r");
$str=fread($fp,1024);
pclose($fp);

输出结果
index.html
info.php
php.core
test.php

执行系统命令,我们需要考虑两个问题
第一 安全性,第二 超时.
我们在开发的时候有个原则,用户输入的内容是绝对不可信的.我们必须要过滤恶意用户提交的非法内容.
比如你有个系统…需要给用户发邮件….
如果调用Linux的mail来发邮件..就像这样
system(“mail $to /tmp/null &”);
这样就OK了.

原文出处:http://www.imsiren.com/archives/391