PHP-Filesystem Functions- 系统命令执行函数

PHP中提供了几个调用linux命令的函数,exec、system、passthru……

https://www.cnblogs.com/caozy/p/9261224.html

小结一下


 

01 system

   执行外部程序,并且显示输出

 system ( string $command [, int &$return_var ] ) : string
  • 本函数就像是 C 语中的函数 system(),用来执行指令,并输出结果。若是 return_var 参数存在,则执行 command 之后的状态会填入 return_var 中
  • 如果 PHP 运行在服务器模块中, system() 函数还会尝试在每行输出完毕之后, 自动刷新 web 服务器的输出缓存
  • 关于返回值:成功则输出返回命令输出的最后一行, 失败则返回 FALSE。这些是和return_var中的返回状态不同的部分

来自php.net的例子:

<?php
echo '<pre>';

// 输出 shell 命令 "ls" 的返回结果
// 并且将输出的最后一样内容返回到 $last_line
// 将命令的返回值保存到 $retval
$last_line = system('ls', $retval);

// 打印更多信息
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>

在windows系统中执行bat文件删除系统垃圾:

 <?php

    system(‘cmd.bat’,$callback);

    echo $callback;

  ?>//其中$callback变量为被执行文件执行后的输出信息

在linux系统中实现tar文件的在线解压

  <?php

    system(‘tar xvf FileName.tar’,$callback);

    echo $callback;

    ?>

 

02 exec

    执行一个外部程序

 exec ( string $command [, array &$output [, int &$return_var ]] ) : string
  • 如果提供了 output 参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。 数组中的数据不包含行尾的空白字符,例如 \n 字符。 请注意,如果数组中已经包含了部分元素,exec() 函数会在数组末尾追加内容。如果你不想在数组末尾进行追加, 请在传入 exec() 函数之前 对数组使用 unset() 函数进行重置
  • 如果同时提供 outputreturn_var 参数, 命令执行后的返回状态会被写入到此变量。
  • 关于返回值:命令执行结果的最后一行内容。 如果你需要获取未经处理的全部输出数据, 请使用 passthru() 函数;如果想要获取命令的输出内容, 请确保使用 output 参数。

         总结:exec ()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。

来自php.net的例子:

<?php
// 输出运行中的 php/httpd 进程的创建者用户名
// (在可以执行 "whoami" 命令的系统上)
echo exec('whoami');
?>

 

 


03 popen

打开进程文件指针

 popen ( string $command , string $mode ) : resource
  • 打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
  • 返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets()fgetss()fwrite()。 当模式为 'r',返回的文件指针等于命令的 STDOUT,当模式为 'w',返回的文件指针等于命令的 STDIN。
  • 如果出错返回 FALSE
  • 它允许访问 shell 返回的任何错误信息
  • 模式mode:

     

    来自php.net的的例子:

    <?php
    error_reporting(E_ALL);//报告所有的PHP错误
    
    /* 加入重定向以得到标准错误输出 stderr。 */
    $handle = popen('/path/to/executable 2>&1', 'r');
    echo "'$handle'; " . gettype($handle) . "\n";
    $read = fread($handle, 2096);//读取文件(可安全用于二进制文件)
    echo $read;
    pclose($handle);
    ?>

    2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了/path/to/executable。那么标准错误也会输出到/path/to/executable

    可以把/path/to/executable可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.

https://www.cnblogs.com/zhenghongxin/p/7029173.html


 

04 eval

把字符串作为PHP代码执行

 eval ( string $code ) : mixed
  •  需要被执行的字符串code:传入的必须是有效的 PHP 代码。所有的语句必须以分号结尾。比如 'echo "Hi!"' 会导致一个 parse error,而 'echo "Hi!";' 则会正常运行。return 语句会立即中止当前字符串的执行。
  • 关于返回值:eval() 返回 NULL,它只是负责执行,除非在执行的代码中 return 了一个值,函数返回传递给 return 的值
<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>
This is a $string with my $name in it.
This is a cup with my coffee in it.

 


 

05 assert

检查一个断言是否为 FALSE

编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。

assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动(视assert_options而定)。

assert_options

  • 'ASSERT_ACTIVE=1' // Assert函数的开关
  • 'ASSERT_WARNING =1' // 当表达式为false时,是否要输出警告性的错误提示,issue a PHP warning for each failed assertion
  • 'ASSERT_BAIL= 0' // 是否要中止运行;terminate execution on failed assertions
  • 'ASSERT_QUIET_EVAL= 0' // 是否关闭错误提示,在执行表达式时;disable error_reporting during assertion expression evaluation
  • 'ASSERT_CALLBACK= (NULL)' // 是否启动回调函数 user function to call on failed assertions
# PHP5
bool assert ( mixed $assertion [, string $description ] ) 

# PHP7
bool assert ( mixed $assertion [, Throwable $exception ] )
<?php
// 激活断言,并设置它为 quiet
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);

//创建处理函数
function my_assert_handler($file, $line, $code, $desc = null)
{
    echo "Assertion failed at $file:$line: $code";
    if ($desc) {
        echo ": $desc";
    }
    echo "\n";
}

// 设置回调函数
assert_options(ASSERT_CALLBACK, 'my_assert_handler');

// Make an assertion that should fail
assert('2 < 1');
assert('2 < 1', 'Two is less than one');
?>
Assertion failed at test.php:21: 2 < 1
Assertion failed at test.php:22: 2 < 1: Two is less than one

如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。跟eval()类似, 不过eval($assertion)只是执行符合php编码规范的$code_str。

 


06 passthru

执行外部程序并且显示原始输出

 passthru ( string $command [, int &$return_var ] ) : void
  • exec() 函数类似, passthru() 函数 也是用来执行外部命令(command)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec()system() 函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。
  • 没有返回值

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

 

posted @ 2020-10-11 16:22  EleclouD  阅读(198)  评论(0)    收藏  举报