PHP执行程序抛出意外结果

PHP执行程序抛出意外结果,php,lampp,bitnami,Php,Lampp,Bitnami,我正在尝试使用phing自动化部署。当我使用svnlastrevision任务时,我得到以下错误 目标“builddiff”的执行失败,原因如下:/home/ramjee/Work/Projects/it/dev stack/build.xml:88:1:未能解析“svn info--xml”的输出 在进一步调试该问题时,我将其归为以下几点: 以下是一个重新创建问题的小程序: $cmd = "/usr/bin/svn info --non-interactive '/home/ramjee/Wo

我正在尝试使用phing自动化部署。当我使用svnlastrevision任务时,我得到以下错误

目标“builddiff”的执行失败,原因如下:/home/ramjee/Work/Projects/it/dev stack/build.xml:88:1:未能解析“svn info--xml”的输出

在进一步调试该问题时,我将其归为以下几点:

以下是一个重新创建问题的小程序:

$cmd = "/usr/bin/svn info --non-interactive '/home/ramjee/Work/Projects/trunk/src' '--xml'";
exec("$cmd 2>&1",$out,$ret_var);

print_r($out);
当我执行上述命令时

一,。使用bitnami lampstack.1.2-5附带的PHP(5.2.17)。我得到以下结果(非预期):

数组
(
[0]=>/usr/bin/svn:/home/ramjee/Work/lampstack-1.2-5/common/lib/libsasl2.so.2:没有可用的版本信息(/usr/lib/libldap_r-2.4.so.2需要)
[1] =>/usr/bin/svn:/home/ramjee/Work/lampstack-1.2-5/common/lib/libsasl2.so.2:没有可用的版本信息(由/usr/lib/libsvn\u ra\u svn-1.so.1所需)
[2] => 
[3] => 
[4] =>kind=“dir”
[6] =>path=“/home/ramjee/Work/Projects/trunk/src”
[7] =>修订版=“818”>
[8] => svn://abc.abc.abc.abc/data/repositories/src
[9] => 
[10] => svn://abc.abc.abc.abc/data/repositories/
[11] =>f74a063e-5e8e-11e0-b400-13ff509e0209
[12] => 
[13] => 
[14] =>正常
[15] =>无穷大
[16] => 
[17] =>修订版=“802”>
[19] =>shweta
[20] =>2012-01-03T12:07:46.427638Z
[21] => 
[22] => 
[23] => 
)
二,。使用PHP(5.3.17),这是LAMP设置的一部分。我得到以下结果(预期):

数组
(
[0] => 
[1] => 
[2] =>kind=“dir”
[4] =>path=“/home/ramjee/Work/Projects/trunk/src”
[5] =>修订版=“818”>
[6] => svn://abc.abc.abc.abc/data/repositories/src
[7] => 
[8] => svn://abc.abc.abc.abc/data/repositories/
[9] =>f74a063e-5e8e-11e0-b400-13ff509e0209
[10] => 
[11] => 
[12] =>正常
[13] =>无穷大
[14] => 
[15] =>修订版=“802”>
[17] =>shweta
[18] =>2012-01-03T12:07:46.427638Z
[19] => 
[20] => 
[21] => 
)
在第一行中,我们有两个不需要的行,它们导致phing任务抛出错误


我不知道怎么解决这个问题?这方面的任何帮助都是非常有价值的。

这不是一个很好的解决方案,因为它只是掩盖了问题(以及潜在的其他问题),但您可以从exec中删除
2>&1
部分:

exec($cmd, $out, $ret_var);
2>&1
在bash中用于将STDERR(发送前两行的地方)重定向到STDOUT(发送XML的地方)-有关更多信息,请参阅

这样做的影响是,您正在掩盖错误,以及将来可能从该命令中遇到的任何其他错误。这里有一个较长的解决方案,仍然需要您修补库,但至少感觉不像是黑客:

$cmd = "/usr/bin/svn info --non-interactive '/home/ramjee/Work/Projects/trunk/src' '--xml'";

$descriptors = array(
    1 => array('pipe', 'w'), // stdout
    2 => array('pipe', 'w')  // stderr
);

$process = proc_open($cmd, $descriptors, $pipes);

$out = $err = '';
while ($data = fgets($pipes[1])) { $out .= $data; } // contains your XML
while ($data = fgets($pipes[2])) { $err .= $data; } // contains any errors (which you can log)

这不是一个很好的解决方案,因为它只是掩盖了问题(以及潜在的其他问题),但您可以从exec中删除
2>&1
部分:

exec($cmd, $out, $ret_var);
2>&1
在bash中用于将STDERR(发送前两行的地方)重定向到STDOUT(发送XML的地方)-有关更多信息,请参阅

这样做的影响是,您正在掩盖错误,以及将来可能从该命令中遇到的任何其他错误。这里有一个较长的解决方案,仍然需要您修补库,但至少感觉不像是黑客:

$cmd = "/usr/bin/svn info --non-interactive '/home/ramjee/Work/Projects/trunk/src' '--xml'";

$descriptors = array(
    1 => array('pipe', 'w'), // stdout
    2 => array('pipe', 'w')  // stderr
);

$process = proc_open($cmd, $descriptors, $pipes);

$out = $err = '';
while ($data = fgets($pipes[1])) { $out .= $data; } // contains your XML
while ($data = fgets($pipes[2])) { $err .= $data; } // contains any errors (which you can log)

看看这是否解决了你的问题。我试过了,但没用。我猜在这种情况下,库是从lamp路径而不是共享库路径中拾取的。(尽管不确定)一个黑客的解决方法是删除exec的
2>&1
部分,否则XML似乎是有效的。就错误而言,我只发现了。还有,在共享对象上。黑客的工作真是太棒了,你知道这一变化的影响是什么吗。我必须在第三方库中进行此更改,因此不太关心影响(如果您可以将其作为答案,我也会选择它)。请查看并看看这是否解决了您的问题。我尝试过,但没有任何帮助。我猜在这种情况下,库是从lamp路径而不是共享库路径中拾取的。(尽管不确定)一个黑客的解决方法是删除exec的
2>&1
部分,否则XML似乎是有效的。就错误而言,我只发现了。还有,在共享对象上。黑客的工作真是太棒了,你知道这一变化的影响是什么吗。我必须在第三方库中进行此更改,因此不必担心影响(如果您可以将其作为答案,我也会选择它)。感谢cbuckley,因为这是我的内部应用程序(用于自动生成),我将继续使用第一个解决方案。但是感谢详细的解决方案。感谢cbuckley,因为这是我的内部应用程序(用于自动构建),所以我将继续使用第一个解决方案。但感谢您提供的详细解决方案。