
在 PHP 开发过程中,脚本与操作系统之间的交互是一项常见且关键的能力,它使 PHP 能够调用外部程序或系统命令,从而突破自身功能的局限。借助命令行指令,PHP 可完成图像处理、视频转码、文件压缩及系统级任务等操作,显著提升其在复杂业务场景中的适用性。PHP 为此提供了一系列内置函数,主要包括 exec()、shell_exec()、passthru() 与 system(),它们在执行方式、返回值及适用场景方面各具特性,开发者应依据具体需求加以选用。
主要函数及其使用场景
1. exec()
exec() 适用于需获取命令输出并进行后续处理的场景。该函数执行外部命令,默认仅返回输出的最后一行。借助第二个参数可将全部输出按行保存至数组,第三个参数用于接收命令退出状态码,便于判断执行结果。
<?php
$command = 'ls -l';
$output = [];
$status = null;
$lastLine = exec($command, $output, $status);
if ($status === 0) {
echo "命令执行成功,输出行数:" . count($output);
} else {
echo "命令执行失败,状态码:" . $status;
}
?>2. shell_exec()
shell_exec() 执行指定命令并返回完整输出内容,类型为字符串。当无需逐行解析输出且仅需整体文本结果时,此函数尤为便利。
<?php
$output = shell_exec('pwd');
echo "当前目录:" . $output;
?>3. passthru()
passthru() 直接将命令的标准输出发送至浏览器,适用于输出二进制数据(如图像、文件)或实时呈现长时间运行命令结果的场景。该函数无返回值,但可通过第二个参数获取状态码。
<?php
passthru('cat /path/to/image.jpg', $status);
?>4. system()
system() 与 passthru() 类似,亦直接将输出显示于浏览器,但同时返回输出的最后一行。适用于需即时展示输出且要获取部分结果的简单命令。
<?php
$lastLine = system('ls -l', $returnStatus);
echo "最后一行输出:" . $lastLine;
?>安全注意事项
在 PHP 中执行系统命令时,若命令字符串涉及用户输入,必须防范命令注入风险。应对输入实施严格过滤与转义,建议使用 escapeshellarg() 或 escapeshellcmd() 对参数进行处理,避免直接拼接不可信内容。
<?php
$userInput = $_GET['filename'];
$safeInput = escapeshellarg($userInput);
$output = shell_exec('ls -l ' . $safeInput);
?>小结
PHP 提供的命令执行函数各具特点,可按如下原则选用:
需获取完整输出并进一步处理时,选用
exec();仅需以字符串形式获取完整输出时,选用
shell_exec();需将输出直接发送至浏览器(如二进制文件或实时流)时,选用
passthru();需即时输出并获取最后一行结果时,选用
system()。
结合实际业务场景与安全规范合理选型,可在确保效率的同时提升 PHP 与系统命令交互的安全性与可控性。