PHP的exec()执行git fetch失败,返回值为255。

4
我修改了这个 Github 项目的一个版本 https://github.com/lkwdwrd/git-deploy [因为在我的服务器上(Mediatemple Grid Server),某些原因导致 JSON 无法被解析,并且我还添加了自定义日志记录]。该脚本使用 git 钩子自动部署 github 仓库。
该脚本一段时间以来一直正常工作,但最近停止工作了。
我已经确认问题出在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个回答

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将其称为“部署密钥”)。


确认一下,我运行了 exec('whoami') 命令,并且脚本正在以我登录的相同用户身份运行。此外,git 仓库不使用 ssh,而只是使用 https 远程连接,因此不应该出现密钥错误。 - iiz
似乎将其添加到命令末尾仍未从$ fetch_output返回任何内容,但将$ fetch_return_var更改为254(这是旧值减1?!) - iiz
我相信脚本是由Apache运行的。Github将有效负载发送到URL,然后脚本解析该有效负载并执行其操作。是的,该存储库是公共的,任何人都可以使用HTTP URL克隆它。您所说的“process open”是指proc_open()吗? - iiz
дёҖдёӘж–°зәҝзҙўгҖӮжүҖд»ҘжҲ‘з”Ёproc_open()йҮҚеҶҷдәҶexec()пјҢ然еҗҺstderrжҳҫзӨәпјҡй”ҷиҜҜпјҡж— жі•еҜ№git-remote-httpsжү§иЎҢforkпјҲпјүпјҡиө„жәҗжҡӮж—¶дёҚеҸҜз”ЁгҖӮиҝҷжҳҜд»Җд№Ҳж„ҸжҖқпјҹ - iiz
所以我认为这意味着由于某种原因,我的服务器负载过多?这可以解释为什么之前它能够工作,现在却出了问题。我想我需要联系我的托管服务提供商,因为这是一种共享环境。 - iiz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接