Jörg Reinholz: Files zippen auf einem (unix/linux) NAS mit php/apache/mysql

Beitrag lesen

Du kannst ihr jede beliebige Ändung geben, diese spielt erstmal keinerlei Rolle, die üblicherweise verwendete Kurzvariante wäre übrigens .tbz oder .tb2

Naja. Ich hatte tar -czf (also gzip zum Packen) und die Endung tar.gz statt bzip2 und die vorgeschlagenen Endungen vorgeschlagen, weil ggf. Windows-Anwendungen damit besser klarkommen.

tar -czf archiv.tgz datei_1 datei_N dir_1 dir_N wäre dann also auch ein Kandidat.
tar -cjf archiv.tb2 datei_1 datei_N dir_1 dir_N wäre dann also ein anderer Kandidat.

Noch eine Alternative: Etwas wie

header ('content-type: application/x-gtar-compressed'); # see /etc/mime.types  
...  
passthru('tar -czO dir1 dir2 dirN file1 file2 foleN');

wäre in einfachen Fällen meine Methode der Wahl, die Ausgabe erfolgt dann direkt.

Willst Du aber die Rückgaben (Fehler?) auswerten und hast Du es mit Benutzereingaben zu tun, dann nimm ETWAS WIE:

  
$arItems[]='/var/log/syslog'                           #Eine Datei, es können mehr sein  
$arItems[]='/var/log/apache/'                          #Ein Verzeichnis, es können mehr sein  
  
$itemShellEscaped='';  
$tempfile=tempnam();                                   # temporäre Datei wird angelegt (Der  
                                                       # zurück gegebene Name ist sicher)  
unset ($arItems);                                      # falls nötig  
  
  
foreach ($arItems as $item) {  
   $itemsShellEscaped .= escapeshellarg($item).' ';    # escapeshellarg() nicht entfernen!  
                                 # Nur bei fixen Dateien, dann manuell escapen...  
}                                # http://www.php.net/manual/de/function.escapeshellarg.php  
$shCommand="tar -czf $tempfile $itemsShellEscaped 2>&1";  
  
exec($shCommand, &$arReturns, &$intReturn);            # Das macht die eigentliche Arbeit...  
  
if (! $intReturn) {  
    header ('content-type: application/x-gtar-compressed');  
    echo file_get_contents($tempfile);  
} else {  
    die ('  
<pre>Versucht wurde: ' . $shCommand . '</br>  
Ausgaben, Fehler:</br> . htmlentities(implode('</br>', $arReturns)) . '  
</pre>  
');  
}  
unlink($tempfile);                                    # temporäre Datei wird gelöscht  
unset ($returns, $err);                               # falls nötig  

Das ist jetzt mal nicht getestet, aber es zeigt die grundlegende Vorgehensweise.

Jörg Reinholz