2008-12-06 11 views
17

Unten ist der Befehl, den ich Ausführung versucht, ohne Erfolg:Wie PHP exec() Fehler Antworten abrufen?

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

Wenn Sie eine Matrize() am Ende hinzufügen, fängt es, dass ein Fehler ist:

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

Für die oben exec (), ein Berechtigungsproblem verursacht den Fehler, aber PHP zeigt es nicht an. Wie zeigen Sie von PHP an, welcher Fehler auftritt?

Antwort

15

Sie können das Ausgabeergebnis der exec function, indem einen optionalen zweiten Parameter erhalten:

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

$ output in diesem Fall wird nur die Ausgabe von sdtout hält nicht aus die sdterr – Amaynut

2

Wenn Sie nicht den Fehler durch diesen zweiten Parameter finden Sie für das Fehlerprotokoll von Apache suchen, zum Beispiel in Ubuntu Server 12.10 durch den Befehl $ tail /var/log/apache2/error.log Ich lief ein Python-Skript von PHP, dessen Fehler nur dort gedruckt wurde, und damit konnte ich es diagnostizieren. Mit freundlichen Grüßen.

7

Der Parameter $ output scheint nicht zu funktionieren, wenn das aufrufende Programm die Ausgabe an STDERR ausgibt.

Eine bessere Möglichkeit, dies zu umgehen, ist die Ausgabe der Ausgabe von exec in eine Datei umleiten und dann den Inhalt dieser Datei anzeigen, wenn eine Fehlerbedingung vorliegt.

Wenn $ cmd hält der Befehl exec etwas wie folgt hinzu:

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

Dann den Inhalt der Dateispezifikation in $ error_log für detaillierte Informationen untersuchen, warum der Befehl fehlgeschlagen ist.

Beachten Sie auch, dass, wenn Sie diese mit einem & am Ende des Befehls abzweigen, eine sofortige Überprüfung des Inhalts von $ error_log nicht die Log-Informationen enthüllen kann - das Skript kann prüfen/Prozess die Datei, bevor das Betriebssystem hat fertig.

6

Der folgende Code sowohl die normale Ausgabe (von StdOut) erfassen wird und die Fehlerausgabe (von SdtErr).

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

Arbeitete für mich :) – vijay

2

Dieser arbeitete für mich in verschiedenen Szenarien:

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

Der Raum zwischen "2 ist wichtig