微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP:exec(svn commit)不会返回任何错误,也无法正常工作

目前,我正在用PHP文件写到目录中,我将该目录添加(工作正常),然后当我尝试执行svn时,提交它不起作用,也不返回任何错误代码.有人对此有任何想法吗?

$tmp = exec('cd '.$this->build_locations[$this->type].'; svn commit --username user --password pw; ls', $output);

我将cd转到目录(在此执行ls工作正常),然后再执行ls确认其仍在目录中.

我也尝试过:

svn help

这使我所有的命令都很好(所以我知道找不到svn命令不是问题.

我已将文件777更改为可以执行的文件.

编辑代码

    $output = array();
    $tmp1 = exec("cd ".$this->build_locations[$this->type].";");
    $tmp = exec("svn commit ".$this->build_locations[$this->type].$this->app_id." --username user --password password -m 'test' --non-interactive --trust-server-cert --quiet 2>&1;", $output, $error);
    if($error){
        echo('<pre>');
        print_r($output);
        echo('</pre>');
    }
    exit;

这将产生:

Array

    [0] => Could not lookup DNS configuration info service: (ipc/send) invalid destination port
    [1] => svn: Commit Failed (details follow):
    [2] => svn: UnkNown hostname 'my.host'

解决方法:

SVN命令行错误出现在stderr而不是stdout上,这就是为什么您看不到它们的原因.您要执行的操作是将stderr重定向到stdout,然后将print_r($output)重定向以确定错误原因.

exec('svn commit <stuff> 2>&1', $output, $returnStatus);
if ( $returnStatus )
{
    print_r($output);
}

样本输出

Array
(
    [0] => svn: Commit Failed (details follow):
    [1] => svn: '/path/to/<stuff>' is not under version control
)

这是不理想的,因为在本来没有必要的情况下,它将stderr与stdout混合在一起,但是在这种情况下,我不知道另一种获得所需输出方法.如果有人这样做,请发表评论.

注意:exec(…)的第三个参数是返回状态,而不是错误消息,因此您也需要相应地调整代码.

如果进行2& 1修改后的错误输出不能帮助解决问题的根本原因,请在此处发布新的输出.

编辑新信息后:

您是否将此SVN工作副本从其他地方上传到您的服务器?那可以解释这个错误.

如果我从本地存储库中签出工作副本,将其上传到远程服务器,然后尝试提交,则会遇到相同的错误.

在这种情况下,您需要在运行PHP脚本的服务器上执行工作副本的“ svn签出”,以便能够对其进行提交.如果该服务器无法与存储库的服务器通信,那将是另一个问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐