PHP exec()git fetch失败,返回值为255

时间:2015-04-14 18:39:12

标签: php git exec

我修改了这个github项目的一个版本https://github.com/lkwdwrd/git-deploy [我修改了它,因为JSON没有在我的服务器上解析(Mediatemple Grid Server)&我还添加了自定义日志记录]该脚本使用git hooks自动部署github repos。

脚本工作正常一段时间但最近停止了工作。

我已将问题隔离到git fetch命令。这是我正在使用的确切代码:

exec( 'git fetch ' . $this->_remote . ' ' . $this->_branch, $fetch_output, $fetch_return_var );

$fetch_output数组为空,$fetch_return_var为255.所以我认为255实际上意味着-1,这是git命令的错误。

但是,当SSH进入服务器并作为同一个用户运行时,我能够成功执行此命令,其中的字符串与正在构建的exec()函数的第一个参数完全相同。

所以现在我迷路了。

  • 通过SSH手动运行命令和使用exec()之间是否存在有效区别?
  • 有什么方法可以获得返回给exec()的实际git fetch错误?
  • 这可能是我的主机已更改的某种服务器配置,我应该联系他们吗?

提前致谢


更新:

感谢@Matthias Huttar我将exec()更改为proc_open()调用,让我看到了STDERR的输出[不确定为什么它没有通过exec()进行记录,但我认为这是因为它是git fetch]的子流程。输出结果如下:

error: cannot fork() for git-remote-https: Resource temporarily unavailable

所以我认为我的服务器环境存在问题。但是我还是不确定。

1 个答案:

答案 0 :(得分:2)

如果git fetch中存在错误,则输出很可能不会写入stdout而是写入stderr。 exec只会给你输出stdout并忽略stderr。

exec( 'git fetch ' . $this->_remote . ' ' . $this->_branch.' 2>&1', $fetch_output, $fetch_return_var );

很可能会显示您的错误。我怀疑你从php调用的git进程是以不同的用户身份运行的(例如你是apache服务器的用户),因此你可以访问ssh密钥(或用户名/密码)。如果是这种情况,您的错误消息将是“权限被拒绝”。解决方案是为该用户生成一个新的默认ssh密钥,并在github中授予此密钥访问权限(“部署密钥”是github如何调用它)