猿问

通过 shell_exec() 从 git pull 查看更多信息

当我使用 PuTTY 连接到我的服务器,并在控制台中手动输入所有 git 命令时,git pull将显示如下内容:


remote: Enumerating objects: 3, done.

remote: Counting objects: 100% (3/3), done.

remote: Compressing objects: 100% (1/1), done.

remote: Total 2 (delta 1), reused 2 (delta 1), pack-reused 0

Unpacking objects: 100% (2/2), done.

但是,当我通过 PHP 运行相同的命令时,我shell_exec()什么也没得到。


它执行所有请求的操作,但在此过程中不向我显示任何信息。甚至最终没有成功或失败。它没有输出。


PuTTY 控制台显示的所有这些信息来自哪里,但 PHP 不会输出?如何通过 PHP 访问这些信息?


人到中年有点甜
浏览 156回答 2
2回答

慕勒3428872

为了完整起见,我发布了我为解决此问题而编写的实际代码:shell_exec( 'git pull --progress origin master 2>/home/user/domain.com/stderr.txt' );这会将所有“进度”样式的输出消息写入一个名为 stderr.txt 的文件,然后可以从单独的进程动态读取该文件。

qq_遁去的一_1

Unix 命令行程序通过询问标准流 (stdin/stdout/stderr) 是否连接到终端来区分交互式和非交互式用法。PuTTY 是一个终端,因此git pull以交互模式运行。git pull将进度写入 stderr。在网络(CGI、PHP 等)下,stderr 被重定向到 httpd 服务器日志,因此git pull在非交互模式下运行。您可以git pull使用 option强制显示进度,--progress但您还必须将 stderr 重定向到 stdout,以便您可以捕获输出。
随时随地看视频慕课网APP
我要回答