可以通过
的三个 PHP 函数运行外部命令system();
exec();
shell_exec();
但是它们有什么区别呢?尽管它们有特定的应用,但在大多数情况下,它们可以同等使用。我很想知道当它们可以同等使用时,哪一个是首选。例如,对于解压缩文件或压缩文件夹(使用 tar 命令),哪一个是首选(可能从性能角度来看)?
更新:在另一个问题中,我发现了一个非常有用的链接描述了这些函数的不同方面。我在这里分享链接,其他人可能会使用它来更好地了解安全问题和其他方面。
exec — 执行外部程序
system — 执行外部程序并显示输出
shell_exec — 通过 shell 执行命令并以字符串形式返回完整的输出
所以如果你不需要输出,我会选择 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
*/
将单行或多行纯文本输出到 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()
自动回声:(