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

PHP exec()git获取失败,返回值为255,php,git,exec,Php,Git,Exec,我已经修改了这个github项目的一个版本[出于某种原因,我修改了它,因为我的服务器(Mediatemple Grid server)上没有解析JSON&我还添加了自定义日志记录]脚本使用git钩子自动部署github repos 脚本在一段时间内运行良好,但最近停止工作 我已将问题隔离到git fetch命令。这正是我使用的代码: exec('git fetch'.$this->\u remote'..$this->\u branch,$fetch\u output,$fetch\u retu

我已经修改了这个github项目的一个版本[出于某种原因,我修改了它,因为我的服务器(Mediatemple Grid server)上没有解析JSON&我还添加了自定义日志记录]脚本使用git钩子自动部署github repos

脚本在一段时间内运行良好,但最近停止工作

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

exec('git fetch'.$this->\u remote'..$this->\u branch,$fetch\u output,$fetch\u return\u var)

$fetch\u output
数组为空,
$fetch\u return\u var
为255。所以我相信255实际上意味着-1,这是git命令的一个错误

但是,当SSH插入服务器并以同一用户的身份运行时,我能够成功地执行此命令,该用户的字符串与作为exec()函数的第一个参数生成的字符串完全相同

所以现在我迷路了

  • 通过SSH手动运行命令和使用exec()运行命令之间是否存在有效差异
  • 是否有任何方法可以获取返回给exec()的实际git fetch错误
  • 这可能是我的主机更改的某种服务器配置,我应该与他们联系吗
提前谢谢


更新:

感谢@Matthias Huttar,我将我的
exec()
更改为
proc\u open()
调用,该调用允许我查看STDERR的输出[不确定为什么它没有通过
exec()
进行日志记录,但我认为这是因为它是
git fetch
]的子进程。该输出为:

错误:无法fork()用于git远程https:资源暂时不可用


因此,我认为我的服务器环境存在问题。但是我仍然不确定。

如果git fetch中有错误,那么输出很可能不会写入stdout,而是写入stderr。exec将只给您stdout的输出,而忽略stderr

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

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

以确认我运行了
exec('whoami')
,并且脚本与我登录时的用户相同此外,git repo不使用ssh,但远程设备仅使用https,我认为密钥不应该有错误。似乎将其添加到命令末尾仍然不会从
$fetch\u output
返回任何内容,但将
$fetch\u return\u var
更改为254(旧值减去1?!)如何运行该脚本?它是由Apache运行还是由shell执行?如果使用普通https,存储库是否完全公开(不需要http作者)?另一种选择是使用processopen而不是exec,这样您就可以分别获取stdout和stderr。(这意味着您不需要在结尾处使用2>&1。我相信该脚本是由Apache运行的。Github将负载发送到url,脚本解析该负载并执行其操作。是的,repo是公共的,任何人都可以使用http url进行克隆。process open是指
proc_open()
?是的,我的意思是proc_open。这至少可以给你一个关于错误的线索。