exec 默认只返回最后一行输出,要获取完整输出需传入第二个参数数组接收每行结果,或改用 shell_exec/passthru;三个参数分别指定命令、输出数组引用和返回状态码。

PHP exec 执行命令后怎么拿到输出内容
直接用 exec 默认只返回最后一行,不是完整输出。想拿全部输出,必须传入第二个参数(数组变量)接收每行结果,或者改用 shell_exec / passthru 等更合适的函数。
exec 的三个参数分别起什么作用
exec 函数签名是 exec(string $command, array &$output = [], int &$return_var = null): string:
- 第一个参数
$command是要执行的 shell 命令,比如"curl -s http://localhost:8080/health" - 第二个参数
$output是引用传入的数组,命令每行输出会按顺序追加进这个数组(["ok", "uptime: 123"]) - 第三个参数
$return_var接收命令的退出状态码(0 表示成功,非 0 通常是失败) - 函数本身的返回值只是最后一行输出(不推荐依赖它取结果)
为什么 exec 有时拿不到输出或卡住
常见原因不是 PHP 写法问题,而是底层命令行为或环境限制:
- 命令本身没输出(比如后台服务启动后立即返回,但实际日志打到 stderr)→ 要加
2>&1合并错误流:"your-command 2>&1" - 命令阻塞等待输入或超时未设 → 加
timeout控制时长:"timeout 5s your-command 2>&1" - Web 服务器用户(如 www-data)没权限访问目标服务端口或二进制文件 → 检查
whoami和ls -l权限 - PHP 禁用了某些函数(
exec在disable_functions里)→ 查phpinfo()或ini_get('disable_functions')
更稳妥的替代方案:shell_exec vs passthru vs exec
根据使用场景选:
【极品模板】出品的一款功能强大、安全性高、调用简单、扩展灵活的响应式多语言企业网站管理系统。 产品主要功能如下: 01、支持多语言扩展(独立内容表,可一键复制中文版数据) 02、支持一键修改后台路径; 03、杜绝常见弱口令,内置多种参数过滤、有效防范常见XSS; 04、支持文件分片上传功能,实现大文件轻松上传; 05、支持一键获取微信公众号文章(保存文章的图片到本地服务器); 06、支持一键
立即学习“PHP免费学习笔记(深入)”;
- 要完整字符串输出(含换行)→ 用
shell_exec,例如:$out = shell_exec("ps aux | grep nginx 2>&1"); - 要直接输出到浏览器/终端(比如跑个 ffmpeg 转码并实时刷进度)→ 用
passthru,它不捕获输出,但能传回 exit code - 只要判断成败 + 拿几行关键日志 → 用
exec配合$output和$return_var - 需要精细控制 stdin/stdout/stderr → 上
proc_open,但复杂度陡增,普通调服务没必要
别忘了所有外部命令都存在注入风险,拼接 $command 前务必过滤(escapeshellarg() 处理变量,不用 $_GET 直接拼)。










