2008-12-06 14 views
17

Poniżej jest polecenie próbowałem wykonywanie, bez powodzenia:Jak odzyskać odpowiedzi błędów exec() PHP?

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess'); 

Podczas dodawania die() na końcu, to łapie, że wystąpi błąd:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!'); 

Na powyższym exec (), problem uprawnień powoduje błąd, ale PHP go nie wyświetla. Jak wyświetlasz z PHP, jaki błąd występuje?

Odpowiedz

15

można otrzymać wynik wyjściowy exec function przekazując opcjonalny drugi parametr:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output); 
var_dump($output); 
+5

$ wyjścia w tym przypadku będzie posiadać tylko wyjście z sdtout nie od sdterr – Amaynut

2

Jeśli nie znaleźć błąd przez tego drugiego parametru, można wyszukać w dzienniku błędów w apache, na przykład w Ubuntu Server 12.10 za pomocą polecenia $ tail /var/log/apache2/error.log Uruchomiłem skrypt Pythona z php, którego błąd został tam wydrukowany, a więc udało mi się go zdiagnozować. Pozdrawiamy.

7

Parametr $ output wydaje się nie działać, jeśli program wywołujący wypisze wyjście do STDERR.

Lepszym sposobem radzenia sobie z tym jest przekierowanie wyjścia z exec do pliku, a następnie wyświetlenie zawartości tego pliku, jeśli wystąpił błąd.

Jeśli $ cmd posiada polecenie exec dodać coś takiego:

$cmd.=" > $error_log 2>&1" 

Następnie bada zawartość spec w $ error_log do szczegółowych informacji na temat dlaczego polecenie nie powiodło się.

Należy również zauważyć, że jeśli rozwiążesz to z & na końcu polecenia, natychmiastowe sprawdzenie zawartości $ error_log może nie ujawnić informacji dziennika - skrypt może sprawdzić/przetworzyć plik przed OS skończone.

6

Poniższy kod będzie przechwytywać zarówno wyjście normalne (od wyjścia) i wyjście błędu (od SdtErr).

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess' . '2>&1',$output); 
var_dump($output); 
+0

Pracował dla mnie :) – vijay

2

ten pracował dla mnie w kilku scenariuszy:

ob_start(); 
exec($cmd . " 2>&1", $output); 
$result = ob_get_contents(); 
ob_end_clean(); 
var_dump($result); 

Przestrzeń między "2 jest ważna

Powiązane problemy