在PHP开发过程中,有时候需要调用系统层面的Shell命令来实现一些特定功能,比如批量处理文件、调用系统工具完成数据转换等。PHP提供了多个可以执行Shell命令的函数,其中exec和shell_exec是最常用的两个,不过两者的行为存在明显差异,使用时需要根据实际需求选择。

exec函数的基本用法
exec函数用于执行一个外部程序,它的函数定义如下:
<?php /** * exec函数定义 * @param string $command 要执行的Shell命令 * @param array $output 可选参数,用于接收命令执行后的输出内容,每行输出作为数组的一个元素 * @param int $return_var 可选参数,用于接收命令执行后的返回状态码 * @return string|false 返回命令输出的最后一行内容,执行失败返回false */ exec(string $command, array &$output = null, int &$return_var = null): string|false ?>
下面是一个简单的使用示例:
<?php $command = "ls -l /tmp"; // 不接收输出数组和返回码,只获取最后一行输出 $lastLine = exec($command); echo "最后一行输出:" . $lastLine . PHP_EOL; // 接收输出数组和返回码 $output = []; $returnCode = 0; exec($command, $output, $returnCode); echo "所有输出:" . PHP_EOL; print_r($output); echo "返回状态码:" . $returnCode . PHP_EOL; ?>
shell_exec函数的基本用法
shell_exec函数同样用于执行Shell命令,它的函数定义更简单:
<?php /** * shell_exec函数定义 * @param string $command 要执行的Shell命令 * @return string|false|null 返回命令执行的全部输出内容,执行失败返回false,命令没有输出返回null */ shell_exec(string $command): string|false|null ?>
对应的使用示例:
<?php
$command = "ls -l /tmp";
$allOutput = shell_exec($command);
if ($allOutput !== null) {
echo "命令全部输出:" . PHP_EOL;
echo $allOutput;
} else {
echo "命令没有输出或执行失败" . PHP_EOL;
}
?>
exec与shell_exec的核心区别
返回值不同
exec函数默认只返回命令执行的最后一行输出内容,如果需要获取全部输出,需要通过第二个参数$output数组来接收。而shell_exec函数会直接返回命令执行的所有输出内容,是一个完整的字符串。
输出处理方式不同
exec函数的输出可以通过引用参数$output直接获取数组形式的结果,方便逐行处理;shell_exec返回的是字符串,需要开发者自行拆分处理多行输出。另外exec还可以通过第三个参数获取命令的退出状态码,shell_exec无法直接获取状态码,需要额外通过其他方式判断命令是否执行成功。
使用场景差异
如果只需要获取命令的最后一行输出,或者需要同时获取命令的退出状态码,优先选择exec函数。如果需要获取命令的完整输出内容,不需要关心退出状态码,使用shell_exec会更简洁。
使用注意事项
在使用这两个函数执行Shell命令时,需要注意命令注入的安全问题,不要直接拼接用户输入的内容到命令中,避免恶意用户执行非法命令。如果必须拼接用户输入,要使用escapeshellarg函数对用户输入进行转义处理。
另外,部分服务器环境可能会禁用这两个函数,使用前可以通过phpinfo查看disable_functions配置项,确认函数是否可用。如果执行命令时权限不足,需要检查运行PHP进程的用户是否有对应的命令执行权限。
<?php // 安全的命令拼接示例 $userInput = $_GET['filename'] ?? ''; $safeInput = escapeshellarg($userInput); $command = "ls -l " . $safeInput; $output = shell_exec($command); echo $output; ?>
PHPexecshell_execShell命令执行修改时间:2026-07-12 18:45:20