PHP – 系统调用



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>';

   // 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;
?>

它将产生以下输出 -

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

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 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

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);
   
?>

它将产生以下输出 -

Returned with status 0 and output: array(1) 
{ [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');
?>

它将产生以下输出 -

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

反引号运算符

PHP 支持一个执行运算符:反引号 (``)。(它们不是单引号!)PHP 将尝试将反引号中的内容作为 shell 命令执行;将返回输出。反引号运算符的使用与 shell_exec() 相同。

示例

看看下面的例子 -

<?php
   $output = `dir *.php`;
   echo "<pre>$output</pre>";
?>

它将产生以下输出 -

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() 被禁用时,反引号运算符也被禁用。

广告