PHP Exec бросает неожиданные результаты - PullRequest
1 голос
/ 05 января 2012

Я пытаюсь автоматизировать развертывание с помощью 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);

Когда я выполню вышеуказанное

я. С PHP (5.2.17), поставляемым с ламповым стеком bitnami.1.2-5. Я получаю следующий результат (не ожидается):

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

II. С PHP (5.3.17), который был частью установки lampp. Я получаю следующий результат (ожидаемый):

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.

Я не знаю, как это исправить? Любая помощь по этому вопросу будет очень ценной.

1 Ответ

1 голос
/ 06 января 2012

Это не очень хорошее решение, поскольку оно просто маскирует проблему (и, возможно, другие проблемы), но вы можете удалить часть 2>&1 из exec:

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

2>&1 используетсяв bash для перенаправления STDERR (где отправляются первые 2 строки) в 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)
...