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

    //输出DOS命令“dir”的所有结果,并返回
    //最后一行输出为$lastline。存储返回值
    //在$retval中执行shell命令。
   $last_line = system('dir/w', $retval);

   // 打印附加信息
   echo '
   </pre>
   <hr />输出的最后一行: ' . $last_line . '
   <hr />返回值: ' . $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()