2010-10-05 4 views
33

Ich versuche, bestimmte Ausgabe für Svn-Befehl im XML-Format zu bekommen. Die Ausgabe ist in Ordnung, wenn ich gültige Parameter eintippe. Wenn ich jedoch ein falsches Passwort eintippe, zeigt die Ausgabe keine Fehlermeldung an. Dies ist der PHP-Code:PHP exec() gibt keine Fehlermeldung in der Ausgabe

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output); 

Hier ausgegeben ich im Terminal erhalten:

<?xml version="1.0"?> 
<log> 
svn: OPTIONS of 'http://a51.unfuddle.com/svn/a51_activecollab': authorization failed: Could not authenticate to server: rejected Basic challenge (http://a51.unfuddle.com) 

Und hier ist der Ausgang I von der $ Ausgangsgröße erhalten mit var_dump:

array(2) { 
[0]=> 
string(21) "<?xml version="1.0"?>" 
[1]=> 
string(5) "<log>" 
} 

Wie Sie sehen können, gibt die $ output-Variable nicht die dritte Zeile der Ausgabe zurück, wo Terminal tut. Bitte helfen Sie mir, die gleiche Ausgabe zu erhalten, wie ich es in Terminal bekomme (ich habe sogar mit Shell_Exec() oder System() Methoden versucht, aber sie geben die gleiche Ausgabe wie Exec()) Wie bekomme ich volle Ausgabe? Vielen Dank im Voraus!

Antwort

62

Sie müssen die stderr zu erfassen.

Umleiten stderr zu stdout sollte den Trick tun. Füge 2>&1 an das Ende deines Befehls an.

z.B.

exec("/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/ 2>&1", $output); 
+0

Dies löste das Problem. Vielen Dank. – Goran

+8

Nebenbei: ist es nicht bizarr, dass PHPs exec keine einfache Möglichkeit bietet, die 'stderr'-Ausgabe getrennt zu erfassen? –

-2

Sie müssen eine Variable, in der definieren, um die Nachricht zu speichern

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51 _activecollab/');

0

, die wahrscheinlich nicht die Lösung ist, nur ein schlechter Vorschlag: Sie haben ein zusätzliches Echo in dem Befehl hinzufügen versucht:

Und der andere Weg zu lösen, ist wie bereits erwähnt: Wenn Sie nicht die letzte Zeile in der $ -Ausgabe haben, ist es in den zurückgegebenen Wert der exec() -Funktion sowieso. Sie müssten dann

$totalOutput = push($msg,$output); 

mit

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);