Die Idee, einen Systembefehl als Einzeiler zu erzeugen und loszuballern erscheint „schlank“, hat aber Nachteile bei der Fehlersuche.
Rezept:
- Trenne das!
- Arbeite bei Shell-Befehlen mit einer Umleitung, um Fehler zeigen zu können.
- Notiere übersichtlicher! (Lange Zeilen sind Mist!)
$sys='/bin/gunzip -c ' . $wp_path . ' 2>> /tmp/error.log'
. ' | /usr/bin/mysql -u' . $db_user
. ' -p' . escapeshellarg( $db_pass )
. ' -h' . $db_host . ' ' . $db_name
. ' 2>> /tmp/error.log'
;
system( $sys , $fp );
Dann kannst Du nämlich mit ...
if( $fp == 0 ) {
echo "Daten importiert";
} else {
error_reporting( E_ALL );
ini_set( 'display_errors', 0 );
trigger_error(
"Fehler beim Shell-Befehl '$sys' - Weitere Informationen in Datei /tmp/error.log!",
E_USER_ERROR
);
}
... das Wegloggen des womöglich fehlerhaften Strings in das Error-Log (unter Vermeidung einer Anzeige von Datenbank, Benutzernamen und Passwort im Browser) erzwingen.
Die Fehler, welche gzip bzw. sodann die Datenbank schmeißt, findest Du, dank der Umleitungen in der Datei /tmp/error.log
. Freilich könnte man die (vor dem Ausstieg mit trigger_error(…, E_USER_ERROR)
) auch ins error-log von php übernehmen…