在不少时候利用php的exec,system等函数调用系统命令能够帮助咱们更好更快的完成工做。好比前二天笔者在批量处理.rar文件时exec就帮我了大忙了。 php
今天整理一下经常使用的调用系统函数发出来和你们分享经验。 html
注意:要想使用这二个函数php.ini中的安全模式必须关闭,要否则为了安全起见php是不让调用系统命令的。 linux
先看一下php手册对这二个函数的解释: web
exec --- 执行外部程式 shell
语法 : string exec ( string command [, array &output [, int &return_var]] ) 数组
exec函数解析 浏览器
exec语法: string exec(string command, string [array], int [return_var]); 安全
exec返回值: 字符串 函数
Exec参数说明 网站
Command – 须要执行的命令
Array – 是输出值
return_var –是返回值0或1,若是返回0则执行成功,返回1则执行失败。
exec不成功,调试方案
一个技巧就是使用管道命令, 使用 2>&1, 命令就会输出shell执行时的错误到$output变量, 输出该变量便可分析。
如:
exec('convert a.jpg b.jpg', $output, $return_val);
改成:
exec('convert a.jpg b.jpg 2>&1', $output, $return_val);
print_r($output);
说明 :
exec( )执行给予的命令command,不过它并不会输出任何东西,它简单的从命令的结果中传回最后一行,若是你须要去执行一个命令,而且从命令去取得全部资料时,可使用passthru( )这个函数。
若是有给予参数array,则指定的数组将会被命令所输出的每一行填满,注意 : 若是数组先前已经包含了一些元素的话,exec( )将会把它附加在数组的后面,若是你不想要此函数附加元素的话,你能够在传递此数组给exec( )以前呼叫unset( )。
若是有给予参数array和return_var,则传回执行的状态命令将会写到这个变量。
注意 : 若是你容许来自使用者输入的资料,能够传递到此函数,那么你应该使用escapeshellcmd( )来肯定此使用者没法哄骗(trick)系统来执行武断的(arbitrary)命令。
注意 : 若是你使用此函数来启动一个程式,并且但愿在背景里(background)执行的时候离开它,你必须肯定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,不然PHP将会悬挂(hang)直到程式执行结束。
system --- 执行外部程式而且显示输出
语法 : string system ( string command [, int &return_var] )
说明 :
system( )执行给予的命令command,而且输出结果。若是有给予参数return_var,则执行命令的状态码将会写到这个变量。
注意 : 若是你容许来自使用者输入的资料,能够传递到此函数,那么你应该使用escapeshellcmd( )来肯定此使用者没法哄骗(trick)系统来执行武断的(arbitrary)命令。
注意 : 若是你使用此函数来启动一个程式,并且但愿在背景里(background)执行的时候离开它,你必须肯定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,不然PHP将会悬挂(hang)直到程式执行结束。
若是PHP是运做成伺服器模组,在输出每一行后,system( )会试着自动地清除web伺服器的输出缓冲。
成功则传回命令的最后一行,失败则传回false。
若是你须要去执行一个命令,而且从命令去取得全部资料时,可使用passthru( )这个函数。
这二个都是用来调用系统shell命令,
不一样点:
exec能够把执行的结果所有返回到$output函数里(数组),$status是执行的状态 0为成功 1为失败
systerm不须要提供$output函数,他是直接把结果返回出来,一样$return_var是执行的状态码 0为成功 1为失败
exec示例:
<?php
$a = exec("dir",$out,$status);
print_r($a);
print_r($out);
print_r($status);
?>
<?php $a = exec("dir",$out,$status); print_r($a); echo "<br>-----------------------------------------------------<br>"; echo "<pre>"; //print_r($out); var_dump($out); echo "</pre>"; echo "<br>-----------------------------------------------------<br>"; print_r($status); ?>
system示例:
<?php
$a = system("dir",$out);
print_r($a);
print_r($out);
?>
<?php $a = system("dir",$out); echo "<pre>"; //print_r($a); var_dump($a); echo "</pre>"; echo "<br>-----------------------------------------------------<br>"; print_r($out); ?>
你们能够运行一下看效果
在php开发网站中,常常须要执行系统外部命令。php提供4种方法执行系统外部命令:exec()、passthru()、system()、 shell_exec()。下面一一介绍。在开始前,先检查下php配置文件php.ini中是有禁止这是个函数。找到 disable_functions,配置以下:
disable_functions =
若是“disable_functions=”后面有接上面四个函数,将其删除。默认php.ini配置文件中是不由止你调用执行外部命令的函数的。
方法一:exec()
function exec(string $command,array[optional] $output,int[optional] $return_value)
php代码:
<?php
echo exec("ls",$file);
echo "</br>";
print_r($file);
?>
执行结果:
test.php
Array( [0] => index.php [1] => test.php)
知识点:
exec 执行系统外部命令时不会输出结果,而是返回结果的最后一行,若是你想获得结果你可使用第二个参数,让其输出到指定的数组,此数组一个记录表明输出的一 行,即若是输出结果有20行,则这个数组就有20条记录,因此若是你须要反复输出调用不一样系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空 这个数组,以防混乱。第三个参数用来取得命令执行的状态码,一般执行成功都是返回0。
方法二:passthru()
function passthru(string $command,int[optional] $return_value)
代码:
<?php
passthru("ls");
?>
执行结果:
index.phptest.php
知识点:
passthru与system的区别,passthru直接将结果输出到浏览器,不须要使用 echo 或 return 来查看结果,不返回任何值,且其能够输出二进制,好比图像数据。
方法三:system()
function system(string $command,int[optional] $return_value)
代码:
<?php
system("ls /");
?>
执行结果:
binbootcgroupdevetchomeliblost+foundmediamntoptprocrootsbinselinuxsrvsystmpusrvar
知识点:
system和exec的区别在于system在执行系统外部命令时,直接将结果输出到游览器,不须要使用 echo 或 return 来查看结果,若是执行命令成功则返回true,不然返回false。第二个参数与exec第三个参数含义同样。
方法四:反撇号`和shell_exec()
shell_exec() 函数实际上仅是反撇号 (`) 操做符的变体
代码:
<?php
echo `pwd`;
?>
执行结果:
/var/www/html