2010-10-05 11 views
33

Sto cercando di ottenere determinati output per il comando svn in formato XML. L'output è ok quando digito parametri validi. Tuttavia, quando digito la password errata, l'output non mostra il messaggio di errore. Questo è il codice PHP:PHP exec() non restituisce un messaggio di errore nell'output

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

Qui è uscita ottengo nel terminale:

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

E qui sta l'uscita ottengo dalla variabile di uscita $ con var_dump:

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

Come si può vedere la variabile $ output non restituisce la terza riga di output, dove il terminale lo fa. Ti prego di aiutarmi a ottenere lo stesso risultato ottenuto nel terminale (ho anche provato con i metodi shell_exec() o system() ma hanno restituito lo stesso output di exec()) Come ottengo l'output completo? Grazie in anticipo!

risposta

62

è necessario acquisire il stderr troppo.

Reindirizzamento stderr a stdout dovrebbe fare il trucco. Aggiungi 2>&1 alla fine del tuo comando.

ad es.

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

Questo ha risolto il problema. Grazie mille. – Goran

+8

A parte: non è bizzarro che l'exec di PHP non fornisca un modo semplice per catturare separatamente l'output 'stderr'? –

-2

è necessario definire una variabile in cui memorizzare il messaggio

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

0

Questo non è probabilmente la soluzione, solo una cattiva suggestione: avete tentato di aggiungere un eco in più nel comando:

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

E l'altro modo per risolvere ciò che è come già menzionate: se non avete l'ultima riga nel $ uscita, è nel valore restituito della funzione exec() in ogni caso. Avresti quindi

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

con

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