从PHP执行GIT命令并获取错误消息

当我尝试执行合法的东西时 - 它可以正常工作,例如</ p>

 <  code> $ result =git tag 
</ code> </ pre>

返回一个可用标签列表。</ p>

但是当我做某事时 应该返回错误,例如</ p>

  $ result =git clone https://
</ code> </ pre>

它返回 我 NULL </ code>,但没有消息致命:无法创建工作树目录''。:我没有在控制台中看到的这样的文件或目录</ code>。</ p> \ n

如何运行命令并从PHP获取错误消息?</ p>

UPD </ strong>:这不是“如何克隆使用回购的问题” PHP“,它是”如果出现问题,如何检索错误消息“无论如何,在我的例子中 - ”破坏“的存储库链接。</ p>
</ div>

展开原文

原文

When I try to execute something legitimate - it works, like

$result = `git tag`

returns me a list of available tags.

But when I do something that should return error, like

$result = `git clone https://`

it returns me NULL, but not message fatal: could not create work tree dir ''.: No such file or directory that I would see in the console.

How can I run a command and get error message from PHP?

UPD: It is not question "how to clone repo with using PHP", it is "How to retreive error message if something goes wrong" Does not matter what, in my example - "broken" repository link.

drrrdo0802
drrrdo0802 嗯,对不起,我看不出它与我的问题有什么关系...它不是写问题,问题是关于获取错误信息的文本。
大约 4 年之前 回复
dongnong7524
dongnong7524 检查此答案stackoverflow.com/a/8562666/3081659
大约 4 年之前 回复

2个回答



试试这个</ p>

  / *  * 
*执行命令并使用退出代码,stdout和stderr内容重新运行数组
  • @param string $ cmd - 要执行的命令
  • @param string | null $ workdir - 默认工作目录
  • @return string [] - 带键的数组:'code' - 退出代码,'out' - stdout,'err' - stderr
  • /
    function execute($ cmd,$ workdir = null){

    if(is_null) ($ workdir)){
    $ workdir = __DIR __;
    }

    $ descriptorspec = array(
    0 =&gt; array(“pipe”,“r”),// stdin
    1 =&gt; ; array(“pipe”,“w”),// stdout
    2 =&gt; array(“pipe”,“w”),// stderr
    );

    $ process = proc_open($ cmd ,$ descriptorspec,$ pipes,$ workdir,null);

    $ stdout = stream_get_contents($ pipes [1]);
    fclose($ pipes [1]);

    $ stderr = stream_get_contents($ pipes [2]);
    fclose($ pipes [2]);

返回[
'code'=&gt; proc_close($ process),
'out'=&gt; trim($ stdout),
'err'=&gt; trim($ stderr),
];
}
</ code> </ pre>

然后测试</ p>

  $ res = execute('git --version')

Array

[code] =&gt; 0
[out] =&gt; git version 2.1.4
[err] =&gt;

</ code> </ pre>

这会给你你想要的东西</ p>

  $ res = execute('git clone http:// ...')

Array

[code] =&gt; 128
[out] =&gt;
[err] =&gt;克隆到'...'...。
致命:无法访问'http://.../':无法解析主机:..

</ code> </ pre>
</ div>

展开原文

原文

Try this

/**
 * Executes a command and reurns an array with exit code, stdout and stderr content
 * @param string $cmd - Command to execute
 * @param string|null $workdir - Default working directory
 * @return string[] - Array with keys: 'code' - exit code, 'out' - stdout, 'err' - stderr
 */
function execute($cmd, $workdir = null) {

    if (is_null($workdir)) {
        $workdir = __DIR__;
    }

    $descriptorspec = array(
       0 => array("pipe", "r"),  // stdin
       1 => array("pipe", "w"),  // stdout
       2 => array("pipe", "w"),  // stderr
    );

    $process = proc_open($cmd, $descriptorspec, $pipes, $workdir, null);

    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    return [
        'code' => proc_close($process),
        'out' => trim($stdout),
        'err' => trim($stderr),
    ];
}

And then test

$res = execute('git --version')

Array
(
    [code] => 0
    [out] => git version 2.1.4
    [err] => 
)

This will give you what you want

$res = execute('git clone http://...')

Array
(
    [code] => 128
    [out] => 
    [err] => Cloning into '...'...
             fatal: unable to access 'http://.../': Could not resolve host: ..
)

duanreng3439
duanreng3439 太棒了,非常实用!!
3 年多之前 回复
dspym82000
dspym82000 哦,谢谢,这个工作!
大约 4 年之前 回复



只需使用 exec($ result,$ output); </ code> </ p>

$ output是cli行的数组,但它可以使用 sleep()</ code>函数来获取脚本执行的时间。</ p>
</ div>

展开原文

原文

Just use exec($result, $output);

$output is array of cli lines, but it can requir sleep() function to get time on script execution.

duanli9930
duanli9930 网页可能不同,PHP完全能够运行控制台命令,BTW如果您对解决方案感兴趣 - 请查看Pavel的答案。
大约 4 年之前 回复
doutuan8887
doutuan8887 因此,因为您可以使用Jenkins或TeamCity来构建或部署everithing。 Becouse PHP是用于生成网页的languege。 你可以在PHP上开发桌面应用程序,但为什么呢? 只需使用正确的技术。 我不喜欢Django。 对于Web应用程序来说,这是一个糟糕的解决方案,因为PHP更适合它。 而且我不喜欢PHP工作者/ CGI /恶魔等。因为我们有更强大的语言。 我不想伤害你的感情,这只是我的意见。 =)
大约 4 年之前 回复
doujiu9172
doujiu9172 为什么从PHP执行git命令是个坏主意? 假设我使用PHP开发类似builder / deployer的东西,克隆repo有什么不好,从PHP执行类似git tag的东西?
大约 4 年之前 回复
doushan2224
doushan2224 从PHP运行git并使用exec也听起来不对。 =)如果您需要生产服务器的解决方案,那么这是不好的实践,我可以采取另一个答案(这将需要更多的时间),但如果您需要调试您的scrtipt它是一个很好的解决方案。
大约 4 年之前 回复
dongxiji0687
dongxiji0687 这听起来不对。
大约 4 年之前 回复
douxingmou4533
douxingmou4533 我不知道睡眠持续时间,它应该是你的git克隆通常运行时间。
大约 4 年之前 回复
dtgj8529
dtgj8529 我试过exec('git clone https://',$ output); 得到空数组。 我不知道睡眠()应该在什么时候使用它以及应该睡多久? 谢谢!
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问