PHP 内置函数库包括一类函数,这些函数处理从 PHP 代码调用操作系统实用程序和外部程序。在本章中,我们将讨论用于执行系统调用的 PHP 函数。
system() 函数
system() 函数类似于 C 语言的 system() 函数,它执行给定的命令并输出结果。
system(string $command, int &$result_code = null): string|false
如果 PHP 作为服务器模块运行,system() 调用会尝试在每行输出之后自动刷新 Web 服务器的输出缓冲区。成功时返回命令输出的最后一行,失败时返回 false。
例子
以下 PHP 代码片段调用 Windows 操作系统的 DIR 命令,并显示当前目录中的文件列表。
<?php
echo '<pre>';
//输出DOS命令“dir”的所有结果,并返回
//最后一行输出为$lastline。存储返回值
//在$retval中执行shell命令。
$last_line = system('dir/w', $retval);
// 打印附加信息
echo '
</pre>
<hr />输出的最后一行: ' . $last_line . '
<hr />返回值: ' . $retval;
?>
将产生以下输出 -
Volume Serial Number is 7EE4-E492
Directory of C:\xampp\htdocs
[.] [..] applications.html bitnami.css
[dashboard] employee.csv favicon.ico hello.csv
hello.html hello.php homepage.php [img]
index.php [Langi] menu.php myform.php
myname.php new.png new.txt test.php
test.zip [TPcodes] uploadfile.php [webalizer]
welcome.png [xampp]
18 File(s) 123,694 bytes
8 Dir(s) 168,514,232,320 bytes free
Last line of the output: 8 Dir(s) 168,514,232,320 bytes free
Return value: 0
shell_exec() 函数
shell_exec() 函数与 PHP 的反引号运算符相同。它通过 shell 执行给定的命令,并将完整的输出作为字符串返回
shell_exec(string $command): string|false|null
该函数返回一个包含已执行命令输出的字符串,如果无法建立管道,则返回 false,如果发生错误或命令未生成输出,则返回 null。
例子
在下面的代码中,我们使用 shell_exec() 函数来获取当前目录中扩展名为“.php”的文件列表 -
<?php
$output = shell_exec('dir *.php');
echo "<pre>$output</pre>";
?>
它将产生以下输出 -
Volume Serial Number is 7EE4-E492
Directory of C:\xampp\htdocs
10/26/2023 08:27 PM 73 hello.php
10/12/2023 10:40 AM 61 homepage.php
07/16/2015 09:02 PM 260 index.php
10/12/2023 10:39 AM 49 menu.php
09/25/2023 01:43 PM 338 myform.php
10/12/2023 10:49 AM 51 myname.php
10/26/2023 02:00 PM 369 test.php
09/25/2023 01:42 PM 555 uploadfile.php
8 File(s) 1,756 bytes
0 Dir(s) 168,517,771,264 bytes free
exec() 函数
exec() 函数将给定的命令作为字符串参数执行。
exec(string $command, array &$output = null,
int &$result_code = null):string|false
$output 参数(如果指定)是一个数组,该数组将填充命令的每一行输出。
例子
在这种情况下,我们使用 exec() 函数从程序内部调用 whoami 命令。whoami 命令返回用户名。
<?php
// outputs the username that owns the running php/httpd process
// (on a system with the "whoami" executable in the path)
$output=null;
$retval=null;
exec('whoami', $output, $retval);
echo "Returned with status $retval and output:\n";
var_dump($output);
?>
它将产生以下输出 -
{ [0]=> string(13) "gnvbgl3\mlath" }
passthru() 函数
passthru() 函数执行外部程序并显示原始输出。尽管 passthru() 函数与 exec() 或 system() 函数类似,因为它执行命令,但当 OS 命令的输出是需要直接传递回浏览器的二进制数据时,应该使用它来代替它们。
例子
使用 passthu() 函数显示系统 PATH 环境变量内容的 PHP 程序
passthru(string $command, int &$result_code = null): ?false
<?php
passthru ('PATH');
?>
它将产生以下输出 -
C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\WINDOWS\System32\OpenSSH\;C:\xampp\php;C:\Users\mlath\AppData\Local
\Microsoft\WindowsApps;C:\VSCode\Microsoft VS Code\bin
反引号运算符
PHP 支持一个执行运算符:反引号 ( `` )。(它们不是单引号!)PHP 将尝试将反引号的内容作为 shell 命令执行,将返回输出。反引号运算符的使用与 shell_exec() 相同。
例子
请看下面的例子 -
<?php
$output = `dir *.php`;
echo "<pre>$output</pre>";
?>
将产生以下输出 -
Volume Serial Number is 7EE4-E492
Directory of C:\xampp\htdocs
10/26/2023 08:42 PM 61 hello.php
10/12/2023 10:40 AM 61 homepage.php
07/16/2015 09:02 PM 260 index.php
10/12/2023 10:39 AM 49 menu.php
09/25/2023 01:43 PM 338 myform.php
10/12/2023 10:49 AM 51 myname.php
10/26/2023 02:00 PM 369 test.php
09/25/2023 01:42 PM 555 uploadfile.php
8 File(s) 1,744 bytes
0 Dir(s) 168,471,289,856 bytes free
注意:禁用 反引号运算符 时,将禁用 shell_exec() 。