【问题标题】:see more info from git pull via shell_exec()通过 shell_exec() 从 git pull 查看更多信息
【发布时间】:2019-12-12 19:10:25
【问题描述】:

当我使用 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 访问这些信息?

【问题讨论】:

  • 你能给我们看看实际的 PHP 代码吗?在 PHP 中与 shell 交互并不总是那么简单。
  • @ErwinMoller 正如我所说,我的代码执行所有请求的操作。只是它在我等待的过程中没有给我有用/有趣的输出。
  • 当您说命令运行成功时,我相信您。只是与 Unix 风格的程序交互并不总是那么简单。 phd 在下文中为您提供了一些背景知识。

标签: php git shell


【解决方案1】:

Unix 命令行程序通过询问标准流 (stdin/stdout/stderr) 是否连接到终端来区分交互式和非交互式使用。 PuTTY 是一个终端,所以git pull 在交互模式下运行。 git pull 将进度写入标准错误。

在 web(CGI、PHP 等)下,stderr 被重定向到 httpd 服务器日志,因此git pull 以非交互模式运行。您可以使用选项 --progress 强制 git pull 显示进度,但您还必须将 stderr 重定向到 stdout 以便您可以捕获输出。

【讨论】:

  • 谢谢,这是正确的答案。 --progress 并重定向 stderr。我已经在下面发布了确切的 PHP 实现
【解决方案2】:

为了完整起见,我发布了我为解决这个问题而编写的实际代码:

shell_exec( 'git pull --progress origin master 2>/home/user/domain.com/stderr.txt' );

这会将所有“进度”样式的输出消息写入一个名为 stderr.txt 的文件中,然后可以从单独的进程中动态读取该文件。

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 2011-07-05
    • 2018-08-21
    • 2016-09-08
    • 2013-11-12
    • 2016-01-12
    • 2016-10-11
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多