Tar & GZip aus PHP
Harry
- php
Hallo !
Folgendes Problem: Ich möchte mit PHP die Dateien in einem Verzeichnis zusammenfassen und packen.
Dazu rufe ich aus PHP raus "tar" und "gzip" auf:
--------------------------------------------------------
// Dateinamen erzeugen (mit Zufallszahl)
srand((double)microtime()*1000000);
$ciffer = round(rand(0,10000));
// TAR und GZIP starten. Die resultierenden dateinamen haben das format ~abc12345-archiv23456.tar
$gehtes = system("tar -cf /tmp/~".$login."-archiv".$ciffer.".tar /home/".$login.$actdir);
$gehtes2 = system("gzip -9 /tmp/~".$login."-archiv".$ciffer.".tar");
// bei Fehlern: Müll aufräumen
if($gehtes == false || $gehtes2 == false)
{ @unlink("/tmp/~".$login."-archiv".$ciffer.".tar");
@unlink("/tmp/~".$login."-archiv".$ciffer.".tar.gz"); }
------------------------------------------------------------
Das funktioniert ... ab und zu.
Manchmal bleibt das Programm sinnloser Weise nach dem Packen einfach stehen und macht keine weiteren Ausgaben.
Manchmal packt es erst gar nicht.
Es wird aber _immer_ für $gehtes und $gehtes2 "false" zurückgegeben. Warum ?
Die Rechte stimmen alle (sowohl für /tmp als auch für die Verzeichnisse aus denen die Daten geholt werden und tar und gzip) und die einzige "Fehlermeldung" die in den Logs zu finden ist lautet "tar: Removing leading `/' from member names", was ja nicht direkt ein Fehler ist.
Warum immer "false" ?
Warum geht die Packerei manchmal und wann anders nicht ?
Das Ergebnis ist immer das gleiche, egal ob ich exec, shell_ecex, system oder die berühmten Backticks verwende ...
Ciao,
Harry
PS: Daß die Dateien nicht da sind, wenn immer "false" zurückgegeben wird, ist mir schon klar, weil sie ja anschließend gelöscht werden ;-)
Tag.
Also: des Rätsels Lösung (für's Archiv)
Die Rechte stimmen alle (sowohl für /tmp als auch für die Verzeichnisse aus denen die Daten geholt werden und tar und gzip) und die einzige "Fehlermeldung" die in den Logs zu finden ist lautet "tar: Removing leading `/' from member names", was ja nicht direkt ein Fehler ist.
Warum immer "false" ?
Warum geht die Packerei manchmal und wann anders nicht ?
Wurscht, es wird als Fehler interpretiert. Somit ist als Ergebnis "false" durchaus gerechtfertigt. Die Überprüfung, ob der Befehl erfolgreich war, muß also mit file_exists(...) erfolgen.
Warum die Warterei ?
Nun, PHP scheint Probleme zu bekommen, wenn bei einer bestehenden FTP-Verbindung (aus ftp_connect(...)) ein externes Programm aufgerufen wird. Anscheinend wird zwar das Programm ausgeführt, dann aber der Seiten-Code solange nicht weiter abgearbeitet, bis die FTP-Verbindung mit ihrem eigenen Time-Out zusammenbricht (der 30 Sekunden Timeout von PHP scheint keine Rolle zu spielen, da der weiter hinten stehende Code danach weiter abgearbeitet wird).
Die sinnlosen Ergebnisse, die das Script anschließend produzierte, kamen durch den Abbruch der FTP-Verbindung zustande.
Lösung: Die Programme entweder vor dem Aufbau der FTP-Verbindung oder nach ftp_quit ausführen.
Das Ergebnis ist immer das gleiche, egal ob ich exec, shell_exec, system oder die berühmten Backticks verwende ...
Somit scheinen alle vier das gleiche Problem zu haben.
Für die, die sich gewundert haben: shell_exec ist nicht dokumentiert, soll aber (Gerüchten (?) zufolge) das gleich bewirken wie die Backticks.
Ciao,
Harry