• 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 参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。 数组中的数据不包含行尾的空白字符,例如 字符。 请注意,如果数组中已经包含了部分元素,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) . "
      ";
      $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. "
    ";
    eval("$str = "$str";");
    echo $str. "
    ";
    ?>
    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 "
    ";
    }
    
    // 设置回调函数
    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() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
    相同点:都可以获得命令执行的状态码

  • 相关阅读:
    注册审核
    静态表单验证
    多条件查询
    0623TP框架联系
    0618框架 增删改练习
    php框架 数据添加
    0616框架查询
    0614空操作方法 空控制器 跨控制器调用 命名空间
    php 0613框架基础
    php查询
  • 原文地址:https://www.cnblogs.com/elegantcloud/p/13797855.html
Copyright © 2020-2023  润新知