PHP 中的 system()、exec() 和 shell_exec() 有什么区别?

问题描述 投票:0回答:2

可以通过

的三个 PHP 函数运行外部命令
system();
exec();
shell_exec();

但是它们有什么区别呢?尽管它们有特定的应用,但在大多数情况下,它们可以同等使用。我很想知道当它们可以同等使用时,哪一个是首选。例如,对于解压缩文件或压缩文件夹(使用 tar 命令),哪一个是首选(可能从性能角度来看)?

更新:在另一个问题中,我发现了一个非常有用的链接描述了这些函数的不同方面。我在这里分享链接,其他人可能会使用它来更好地了解安全问题和其他方面。

php shell system exec shell-exec
2个回答
93
投票

exec — 执行外部程序

system — 执行外部程序并显示输出

shell_exec — 通过 shell 执行命令并以字符串形式返回完整的输出

所以如果你不需要输出,我会选择 exec。

更多详情:


0
投票

只是用示例扩展现有答案:

所有函数都将尝试执行该命令,就像从终端执行一样。主要区别在于输出和错误处理:

exec()

仅输出最后一行;将每行的数组输出到第二个参数;将

result_code
输出到第三个参数——任何非零
result_code
都是错误。这是 result_codes 列表

$last_line = exec('pwd;ls -alh', $all_lines_array, $result_code);
echo "LAST_LINE: $last_line";
print_r($all_lines_array);
echo "RESULT_CODE: $result_code";

/*
LAST_LINE: -rw-r--r-- 1 ubuntu psacln 1.2K Feb  7 03:43 index.php 

Array
(
    [0] => /var/www/vhosts/example.com/httpdocs/dir/subdir
    [1] => total 20K
    [2] => drwxr-xr-x 3 root         root   4.0K Feb  7 03:17 .
    [3] => drwxr-xr-x 7 ubuntu psacln 4.0K Feb  6 21:46 ..
    [4] => -rw-r--r-- 1 ubuntu psacln  550 Feb  6 22:45 .htaccess
    [5] => drwxr-xr-x 2 ubuntu psacln 4.0K Feb  7 00:22 cache
    [6] => -rw-r--r-- 1 ubuntu psacln 1.2K Feb  7 03:43 index.php
)

RESULT_CODE: 0
*/

shell_exec()

将单行或多行纯文本输出到 var。仅需要 1 个参数——命令

$plain_text = shell_exec('pwd;ls -alh');
echo $plain_text;

/*
/var/www/vhosts/example.com/httpdocs/dir/subdir
total 20K
drwxr-xr-x 3 root         root   4.0K Feb  7 03:17 .
drwxr-xr-x 7 ubuntu psacln 4.0K Feb  6 21:46 ..
-rw-r--r-- 1 ubuntu psacln  550 Feb  6 22:45 .htaccess
drwxr-xr-x 2 ubuntu psacln 4.0K Feb  7 00:22 cache
-rw-r--r-- 1 ubuntu psacln 1.2K Feb  7 03:43 index.php
*/

系统()

回显单行或多行纯文本。不需要

echo system();
result_code
exec()

相同
system('pwd;ls -alh',$result_code);
echo "RESULT_CODE: $result_code";
/*
/var/www/vhosts/example.com/httpdocs/dir/subdir
total 20K
drwxr-xr-x 3 root         root   4.0K Feb  7 03:17 .
drwxr-xr-x 7 ubuntu psacln 4.0K Feb  6 21:46 ..
-rw-r--r-- 1 ubuntu psacln  550 Feb  6 22:45 .htaccess
drwxr-xr-x 2 ubuntu psacln 4.0K Feb  7 00:22 cache
-rw-r--r-- 1 ubuntu psacln 1.2K Feb  7 03:43 index.php

RESULT_CODE: 0
*/

反引号``

基本上是

shell_exec()
的别名。将单行或多行纯文本输出到 var

$plain_text = `pwd;ls -al`;
echo $plain_text;

/*
/var/www/vhosts/example.com/httpdocs/dir/subdir
total 20K
drwxr-xr-x 3 root         root   4.0K Feb  7 03:17 .
drwxr-xr-x 7 ubuntu psacln 4.0K Feb  6 21:46 ..
-rw-r--r-- 1 ubuntu psacln  550 Feb  6 22:45 .htaccess
drwxr-xr-x 2 ubuntu psacln 4.0K Feb  7 00:22 cache
-rw-r--r-- 1 ubuntu psacln 1.2K Feb  7 03:43 index.php
*/

exec()
似乎是最通用的,因为您可以迭代行数组,仅获取最后一行,以及
result_code

如果纯文本更适合您,

shell_exec()
和反引号 `` 就很棒。

system()
自动回声:(

© www.soinside.com 2019 - 2024. All rights reserved.