【问题标题】:PHP exec throwing unexpected resultsPHP exec 抛出意外结果
【发布时间】:2012-02-03 06:11:35
【问题描述】:

我正在尝试使用 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)。我得到以下结果(不是预期的):

Array
(
    [0] => /usr/bin/svn: /home/ramjee/Work/lampstack-1.2-5/common/lib/libsasl2.so.2: no version information available (required by /usr/lib/libldap_r-2.4.so.2)
    [1] => /usr/bin/svn: /home/ramjee/Work/lampstack-1.2-5/common/lib/libsasl2.so.2: no version information available (required by /usr/lib/libsvn_ra_svn-1.so.1)
    [2] => <?xml version="1.0"?>
    [3] => <info>
    [4] => <entry
    [5] =>    kind="dir"
    [6] =>    path="/home/ramjee/Work/Projects/trunk/src"
    [7] =>    revision="818">
    [8] => <url>svn://abc.abc.abc.abc/data/repositories/src</url>
    [9] => <repository>
    [10] => <root>svn://abc.abc.abc.abc/data/repositories/</root>
    [11] => <uuid>f74a063e-5e8e-11e0-b400-13ff509e0209</uuid>
    [12] => </repository>
    [13] => <wc-info>
    [14] => <schedule>normal</schedule>
    [15] => <depth>infinity</depth>
    [16] => </wc-info>
    [17] => <commit
    [18] =>    revision="802">
    [19] => <author>shweta</author>
    [20] => <date>2012-01-03T12:07:46.427638Z</date>
    [21] => </commit>
    [22] => </entry>
    [23] => </info>
)

二。使用作为 Lampp 设置一部分的 PHP (5.3.17)。我得到以下结果(预期):

Array
(
    [0] => <?xml version="1.0"?>
    [1] => <info>
    [2] => <entry
    [3] =>    kind="dir"
    [4] =>    path="/home/ramjee/Work/Projects/trunk/src"
    [5] =>    revision="818">
    [6] => <url>svn://abc.abc.abc.abc/data/repositories/src</url>
    [7] => <repository>
    [8] => <root>svn://abc.abc.abc.abc/data/repositories/</root>
    [9] => <uuid>f74a063e-5e8e-11e0-b400-13ff509e0209</uuid>
    [10] => </repository>
    [11] => <wc-info>
    [12] => <schedule>normal</schedule>
    [13] => <depth>infinity</depth>
    [14] => </wc-info>
    [15] => <commit
    [16] =>    revision="802">
    [17] => <author>shweta</author>
    [18] => <date>2012-01-03T12:07:46.427638Z</date>
    [19] => </commit>
    [20] => </entry>
    [21] => </info>
)

在第一行中,我们有两行不需要的行导致 phing 任务抛出错误。

我不知道如何解决这个问题?对此的任何帮助都将非常有价值。

【问题讨论】:

  • 查看ubuntuforums.org/showpost.php?p=5883384&postcount=3 看看是否能解决您的问题。
  • 我试过了,但没有帮助。我猜在这种情况下,库是从灯路径而不是共享库路径中选择的。 (虽然不确定)
  • 一个 hacky 解决方法是删除 exec 的 2&gt;&amp;1 部分,否则 XML 似乎有效。就错误而言,我只找到了this。另外,a bit more info 在共享对象上。
  • 很棒的 hack 工作,不知道这个变化的影响是什么。我必须在第三方库中进行此更改,因此很少担心影响(如果您可以将其作为答案,也会选择它)。

标签: php lampp bitnami


【解决方案1】:

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

exec($cmd, $out, $ret_var);

2&gt;&amp;1 在 bash 中用于将 STDERR(发送前 2 行的地方)重定向到 STDOUT(发送 XML 的地方)——有关更多信息,请参阅this question

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

$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)

【讨论】:

  • 感谢 cbuckley,因为这对我来说是一个内部应用程序(用于自动化我的构建),所以我将继续使用第一个解决方案。但是感谢您提供详细的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
相关资源
最近更新 更多