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
参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。 数组中的数据不包含行尾的空白字符,例如 - 如果同时提供
output
和return_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() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
相同点:都可以获得命令执行的状态码