Php 简明教程
PHP – System Calls
PHP 内置函数库包括一类函数,用于在 PHP 代码中调用操作系统实用程序和外部程序。在本章中,我们将讨论用于执行系统调用的 PHP 函数。
The system() Function
system() 函数类似于 C 语言中的 system() 函数,可执行给定的命令并输出结果。
system(string $command, int &$result_code = null): string|false
如果 PHP 作为服务器模块运行,system() 调用会尝试在每行输出之后自动刷新 Web 服务器的输出缓冲区。成功时返回命令输出的最后一行,失败时返回 false。
Example
下面的 PHP 代码调用 Windows 操作系统的 DIR 命令,并显示当前目录中的文件列表。
<?php
echo '<pre>';
// Outputs all the result of DOS command "dir", and returns
// the last output line into $last_line. Stores the return value
// of the shell command in $retval.
$last_line = system('dir/w', $retval);
// Printing additional info
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>
它将生成以下 output −
Volume in drive C has no label.
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
The shell_exec() Function
shell_exec() 函数等同于 PHP 的反引号操作符。它通过 shell 执行给定命令,并以字符串的形式返回完整的输出。
shell_exec(string $command): string|false|null
函数返回一个包含已执行命令输出的字符串,如果管道不能建立,则返回 false;如果发生错误或命令没有产生输出,则返回 null。
Example
在下面的代码中,我们使用 shell_exec() 函数在当前目录中获取扩展名为 ".php" 的文件列表 −
<?php
$output = shell_exec('dir *.php');
echo "<pre>$output</pre>";
?>
它将生成以下 output −
Volume in drive C has no label.
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
The exec() Function
exec() 函数以字符串参数的形式执行给定的命令。
exec(string $command, array &$output = null,
int &$result_code = null):string|false
如果指定 $output 参数,它将是一个数组,其中填充了命令的每行输出。
Example
在此情况下,我们使用 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);
?>
它将生成以下 output −
Returned with status 0 and output: array(1)
{ [0]=> string(13) "gnvbgl3\mlath" }
The passthru() Function
passthru() 函数执行外部程序并显示原始输出。虽然 passthru() 函数类似于 exec() 或 system() 函数,因为它执行一个命令,但是当操作系统命令的输出是需要直接传回浏览器的二进制数据时,它应该用在它们的地方。
Example
一个使用 passthu() 函数显示系统 PATH 环境变量内容的 PHP 程序
passthru(string $command, int &$result_code = null): ?false
<?php
passthru ('PATH');
?>
它将生成以下 output −
PATH=C:\Python311\Scripts\;C:\Python311\;C:\WINDOWS\system32;C:\WINDOWS;
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
Backtick Operator
PHP 支持一个执行运算符:反引号 (``)。(它不是单引号!) PHP 会尝试将反引号的内容作为外壳命令执行;将返回输出。反引号运算符的使用与 shell_exec() 相同。
Example
请看以下示例:
<?php
$output = `dir *.php`;
echo "<pre>$output</pre>";
?>
它将生成以下 output −
Volume in drive C has no label.
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() 被禁用时,反引号运算符将被禁用。