PHP中system,exec,passthru函数用法

 更新时间:2016年11月25日 15:02  点击:1525
本文章来给各位同学介绍关于在php中system,exec,passthru函数的一些使用方法,各位同学不防进入参考。


php提供了system(),exec(),passthru()这几个函数来调用外部的命令。

他们的区别 :

system() 输出并返回最后一行shell结果。
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
相同点:都可以获得命令执行的状态码


ystem()、exec()、shell_exec() 官方文件?明如下:

system — Execute an external program and display the output
string system ( string $command [, int &$return_var ] )
exec — Execute an external program
string exec ( string $command [, array &$output [, int &$return_var ]] )
shell_exec — Execute command via shell and return the complete output as a string
string shell_exec ( string $cmd )
ystem()、exec()、shell_exec() 官方文件说明如下:

system — Execute an external program and display the output
string system ( string $command [, int &$return_var ] )
exec — Execute an external program
string exec ( string $command [, array &$output [, int &$return_var ]] )
shell_exec — Execute command via shell and return the complete output as a string
string shell_exec ( string $cmd )
一般系统会有两种输出, 一种是系统状态(return code), 一种是输出文字(output string), 这三个 Function 主要就是这些回传的差异.

system()
$last_line = system('ls', $return_var);
system() 会将输出内容直接印出, 所以若於网页, 会将所有回传内容都显示於页面上.
$last_line: 只能取得最后一行的内容
$return_var: 取得系统状态回传码
exec()
exec('ls', $output, $return_var);
$output: 回传内容都会存於此变数中(储存成阵列), 不会直接秀在页面上.
$return_var: 取得系统状态回传码
shell_exec()
$output = shell_exec('ls');
$output: 回传内容都会存於此变数中(储存成纯文字内容), 不会直接秀在页面上

在PHP中调用外部命令,可以用如下三种方法来实现:

1) 用PHP提供的专门函数
PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。

system()

原型:string system (string command [, int return_var])
system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。

返回结果

        成功返回0, 
        失败(命令不存在等原因)   返回   非0值

例子: system("/usr/local/bin/webalizer/webalizer");

exec()

原型:string exec (string command [, string array [, int return_var]])
exec ()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码。

例子:

 代码如下 复制代码
exec("/bin/ls -l");
exec("/bin/ls -l", $res);
exec("/bin/ls -l", $res, $rc);

passthru()

原型:void passthru (string command [, int return_var])
passthru ()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus (Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。

例子:
header("Content-type: image/gif");
passthru("./ppmtogif hunte.ppm");

2) 用popen()函数打开进程

上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到 root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。
popen ()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一 的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭它。

例子1:
$fp=popen("/bin/ls -l", "r");

例子2 :
/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户,
root密码是 verygood。仅供参考

 代码如下 复制代码
*/
$sucommand = "su --login root --command";
$useradd = "useradd ";
$rootpasswd = "verygood";
$user = "james";
$user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);
?>

3) 用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面)
这个方法以前没有归入PHP的文档,是作为一个秘技存在的。方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。如:
$res='/bin/ls -l';
echo '
'.$res.'
';

这个脚本的输出就象:
hunte.gif
hunte.ppm
jpg.htm
jpg.jpg
passthru.php


范例程式

由此范例执行一次就比较容易理解. (请建立一个目录, 随便放两个档案, 再将此程式放置执行)

 代码如下 复制代码

<?php
echo "nsystem";
$last_line = system('ls', $return_var);
echo "nreturn_var:";
print_r($return_var);
echo "nlast_line:";
print_r($last_line);

echo "nnexec";
exec('ls', $output, $return_var);
echo "nreturn_var:";
print_r($return_var);
echo "noutput:";
print_r($output);

echo "nnshell_exec";
$output = shell_exec('ls');
echo "noutput:";
print_r($output);
?>

*/

 

?>

在计算与指定日期相关的某一周的周几或者某一天的日期时,利用strtotime的参数的语法可以对日期进行加减处理,快速得到想要的日期。
 代码如下 复制代码


$oneDay = "2013-01-01″;

$nextWeekFirstDay = date("Y-m-d",strtotime("$oneDay + 7 days"));

strtotime
这个函数可以将一个时间字符串转化为时间变量
如:
strtotime("2011-1-1″);

好了,有了上面这两个函数来转化为时间变量后就只要直接加减时间了,然后返回的是秒,只要自己再算成天之类的了。如:

 代码如下 复制代码


//第一种方法

$time1 = mktime(10,20,30,2,5,2000); //2000-2-5 10:20:30
$time2 = mktime(18,30,20,5,2,2000); //2000-5-2 18:30:20

//第二种方法

$time1= '2010-7-1';
$time2='2010-7-8';
//计算两者差值
$days=abs((strtotime($date1)-strtotime($date2))/86400);
$diff = (int)(($time2-$time1)/(24*3600));
echo "$time2 和 $time1 的时间差为:" . $diff . "天
";

?>

本文章来给大家介绍php入门教程之工厂模式哦,工厂模式概念:实例化对象,用工厂方法替代new操作,有需要了解学习的朋友可参考。


工厂模式代码:

 

 代码如下 复制代码

<?php
//首先定义什么是人类
 interface Human {
    //人是愉快的,会笑的
    public function laugh();
    //人类还会哭,代表痛苦
    public function cry();
    //人类会说话
    public function talk();
}

//然后定义具体的人种
class YellowHuman implements Human {//黄色人种,这个翻译的不准确,将就点吧
    function cry() { var_dump( "黄色人种会哭");}
    function laugh() {var_dump( "黄色人种会大笑,幸福呀!");}
    function talk() {var_dump( "黄色人种会说话,一般说的都是双字节"); }
}
class WhiteHuman implements Human { //白色人种
    public function cry() {var_dump("白色人种会哭");}
    public function laugh() {var_dump("白色人种会大笑,侵略的笑声"); }
    public function talk() {var_dump("白色人种会说话,一般都是但是单字节!"); }
}
class BlackHuman implements Human { //黑色人种
    public function cry() {var_dump("黑色人种会哭");}
    public function laugh() {var_dump("黑色人种会大笑,侵略的笑声"); }
    public function talk() {var_dump("黑色人种会说话,一般都是但是单字节!"); }
}

//人种也定义完毕了,那我们把八卦炉定义出来:
class HumanFactory {
    //定一个烤箱,泥巴塞进去,人就出来,这个太先进了
    public static function createHuman( $c ){
        if ($c instanceof Human ) {//判断是否继承自Human
            return $c;
        }else {
            var_dump("必须跟HuMan有一腿");
        }
    }
}


var_dump("------------造出的第一批人是这样的:白人-----------------");
$whiteHuman = HumanFactory::createHuman( new WhiteHuman());
$whiteHuman->cry();
$whiteHuman->laugh();
$whiteHuman->talk();
    
 //女娲第二次造人,火候加足点,然后又出了个次品,黑人
var_dump("nn------------造出的第二批人是这样的:黑人-----------------");
$blackHuman = HumanFactory::createHuman(new BlackHuman());
$blackHuman->cry();
$blackHuman->laugh();
$blackHuman->talk();
    
//第三批人了,这次火候掌握的正好,黄色人种(不写黄人,免得引起歧义),备注:RB人不属于此列
var_dump("nn------------造出的第三批人是这样的:黄色人种-----------------");
$yellowHuman = HumanFactory::createHuman(new YellowHuman());
$yellowHuman->cry();
$yellowHuman->laugh();
$yellowHuman->talk();

在php中register globals函数在php5.3.0开始移除在5.4.0开始废弃了,但还是有很多的网站都有这个函数,下面我来介绍一些解决办法。

php4.2.0的版本是没有用过,php官网提到:php最具争议的变化是php4.2.0版本配置中register_globals的On改为了Off,对此项依赖的是如此普遍以至于很多人不知道他的存在而以为php本来就是这么工作的,下面解释这个指令如何写出不安全的代码,但是要知道这个指令没有什么不安全的地方,只有不安全的代码。

当register_globals打开以后,很多代码都可以被注入比如html表单提交的内容,再加上php在使用变量的时候无需初始化,这就使得更容易出现不安全的代码。比如我将php.ini中register_globals设置为On开始状态:

 代码如下 复制代码


<?php
// 当用户合法的时候,赋值 $flag = true
if (is_user()) {
    $flag= true;
}

// 由于并没有事先把 $flag初始化为 false,
// 当 register_globals 打开时,可能通过GET user.php?flag=1 来定义该变量值
// 所以任何人都可以绕过身份验证
if ($flag) {
    include "/highly/sensitive/data.php";
}
?>  


 以上代码在register_globals = On的时候,由于$flag没有初始化,在后面判断的时候通过get方式的flag = 1也可以执行include。

在php中连接数据库多指是mysql数据库了,下面我来给php入门者介绍连接数据库实现方法与出现Call to undefined function mysql_connect()的解决办法。

最简单php连接数据库代码如下

 代码如下 复制代码

<?

$hostname_conn = "localhost";
$database_conn = "数据库名称";
$username_conn = "root";
$password_conn = "数据库密码";
$conn = mysql_pconnect($hostname_conn, $username_conn, $password_conn) or trigger_error(mysql_error(),E_USER_ERROR);

?>

包含到页面里面的时候用require_once,不用include了。

 

 代码如下 复制代码
<?php require_once('Connections/conn.php'); ?>

如果连接时出现错误提示:Call to undefined function mysql_connect()  说明你的配置未成功

解决办法

1.将libmysql.dll和php5ts.dll拷贝至windows目录下的system32下! 
2.修改php.ini  extension_dir = "d:phpext"
2.修改windows安装目录下的php.ini 去掉;extension=php_mysql.dll前面的分号; 

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • c++中的system("pause")的作用和含义解析

    这篇文章主要介绍了c++中system("pause")的作用和含义,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2020-04-25
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25