前言
本文主要给大家介绍了关于在 PHP 中如何执行 Linux 命令的相关内容, 下面话不多说了, 来一起看看详细的介绍吧
PHP 如何执行某个命令 , 官方手册在这里 http://php.net/manual/zh/book.exec.php
我们先从 shell_exec 来说
如何使用 shell_exec 在 PHP 里面执行 shell 命令
先来试一下, 使用 PHP 执行某个 shell 命令, 该命令是 mkdir testdir.
- <?PHP
- $cmd = 'mkdir testdir';
- shell_exec($cmd);
在这个 PHP 脚本执行之前, 目录里面是这样子的:
执行之后, 目录里面是如下图所示, 多了一个 testdir 文件夹, 这是通过我们刚刚在 PHP 脚本里面执行 shell 命令生成的
shell 命令执行失败会如何?
假如说执行 shell 命令的时候出错了, 后面的 PHP 代码还能运行吗? 看下面这个例子, 我要执行的命令是读取并运行 test.sh 这个文件里面的内容, 但是这个文件实际是不存在的.
- <?PHP
- $cmd = 'source test.sh';
- shell_exec($cmd);
- print_r("---the end---\n");
它的打印结果是:
- sh: line 0: source: test.sh: file not found
- ---the end---
可以从打印结果看到, 即使运行某个 shell 命令的时候会出错, 不会影响下面的 PHP 代码的执行. 所以, 如果 shell 命令执行失败了, 我们也没办法用 PHP 的 try-catch 是捕获不到 shell 命令的错误.
就比如下面的代码, 实际上 catch 不到 shell 命令的错误
- <?PHP
- $cmd = 'source test.sh';
- try {
- shell_exec($cmd);
- print_r("---the end---\n");
- } catch (Exception $e) {
- echo 'error=' . $e->getMessage();
- }
它的打印结果是:
- sh: line 0: source: test.sh: file not found
- ---the end---
获取 shell_exec 的输出
看一下官方文档里面提过的 shell_exec
我们在第一个例子里面试一下
- <?PHP
- $cmd = 'mkdir testdir';
- $ret = shell_exec($cmd);
- var_dump($ret);
打印出来的结果是
NULL
所以, 我想, 上面这个应该是命令没有任何输出, 换一个有输出的命令, 如下面代码;
- <?PHP
- $cmd = 'echo $SHELL';
- $ret = shell_exec($cmd);
- var_dump($ret);
它的打印结果是:
string(10) "/bin/bash"
所以, 如果想要用 PHP 执行 shell 命令, 并且知道到底执行成功还是失败, 那么可以在这个 shell 命令的后面加上 2>&1, 把错误输出到标准输出. 这样就可以判断是执行失败还是执行成功. 示例如下:
- <?PHP
- $cmd = 'source test.sh 2>&1';
- $ret = shell_exec($cmd);
- if (empty(ret)) {
- print_r("---success---\n");
- } else {
- print_r("---failed---\n");
- }
- print_r("---the end---\n");
当然, 官方手册里面除了有 shell_exec, 还有其他的, 比如说 exec.
下面就来说说 exec
exec 方法的参数是这样的,$output 是一个数组,$return_var 是一个 int 型的值.$return_var 是 0 的时候表示命令执行成功.
string exec ( string $command [, array &$output [, int &$return_var ]] )
看下面的示例代码:
- <?PHP
- $cmd = 'ls -l /home';
- exec($cmd, $result, $var);
- var_dump($result);
- var_dump($var);
打印结果如下:
再看一下 system
这是 system 的函数说明,$return_var 是 0 的时候表示命令执行成功. system 函数的返回是命令的输出的最后一行的内容
string system ( string $command [, int &$return_var ] )
看下面的示例代码:
- <?PHP
- $cmd = 'mkdir testsystem';;
- $lastline = system($cmd, $var);
- var_dump($lastline);
- var_dump($var);
打印结果为:
- string(0) ""
- int(0)
还有其他的, 就暂时不介绍了
总结
来源: https://www.jb51.net/article/150228.htm