2008-12-02 10 views
9

So habe ich einen Client, der aktuelle Host erlaubt mir nicht, tar über exec()/passthru()/ect zu verwenden, und ich muss die Website regelmäßig und programmatisch so zu sichern Gibt es eine Lösung?Build Tar-Datei aus dem Verzeichnis in PHP ohne exec/passthru

Dies ist ein Linux-Server.

+0

Scheint wie eine seltsame Einschränkung. –

+0

Aber nicht ganz auf dem üblichen, blockieren viele Hosts die Verwendung vollständig statt chjail'ing Benutzer. – UnkwnTech

+0

Richtig, aber es ist dumm, angesichts der Macht von PHP, mit dem Dateisystem zu interagieren. –

Antwort

8

Bei http://pear.php.net/package/Archive_Tar können Sie das PEAR-TAR-Paket donload und es so verwenden Sie das Archiv zu erstellen:

<?php 
require 'Archive/Tar.php'; 
$obj = new Archive_Tar('archive.tar'); 
$path = '/path/to/folder/'; 
$handle=opendir($path); 
$files = array(); 
while(false!==($file = readdir($handle))) 
{ 
    $files[] = $path . $file; 
} 

if ($obj->create($files)) 
{ 
    //Sucess 
} 
else 
{ 
    //Fail 
} 
?> 
4

Es gibt die Archive_Tar Bibliothek. Wenn das aus irgendeinem Grund nicht verwendet werden kann, könnte die Erweiterung zip eine andere Option sein.

+0

Sie haben gepostet, während ich getippt habe, aber ich werde meinen hier behalten, da er den Code hat. – UnkwnTech

0

Ich brauche eine Lösung, die auf Azure-Websites (IIS) und hatte Probleme bei der Erstellung neue Dateien auf dem Server unter Verwendung von Methoden aus anderen Antworten funktionieren würde. Die Lösung, die für mich funktionierte, war die Verwendung einer kleinen Bibliothek TbsZip für die Komprimierung, bei der keine Datei irgendwo auf dem Server geschrieben werden muss - sie wird einfach direkt über HTTP zurückgegeben.

Dieser Thread ist alt, aber dieser Ansatz könnte ein bisschen mehr Generika und vollständige Antwort sein, so poste ich den Code als Alternative:

// Compress all files in current directory and return via HTTP as a ZIP file 
// by buli, 2013 (http://buli.waw.pl) 
// requires TbsZip library from http://www.tinybutstrong.com 

include_once('tbszip.php'); // load the TbsZip library 
$zip = new clsTbsZip(); // instantiate the class 
$zip->CreateNew(); // create a virtual new zip archive 

// iterate through files, skipping directories 
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.')); 
foreach($objects as $name => $object) 
{ 
    $n = str_replace("/", "\\", substr($name, 2)); // path format 
    $zip->FileAdd($n, $n, TBSZIP_FILE); // add fileto zip archive 
} 

$archiveName = "backup_".date('m-d-Y H:i:s').".zip"; // name of the returned file 
$zip->Flush(TBSZIP_DOWNLOAD, $archiveName); // flush the result as an HTTP download 

Und hier ist die ganze article on my blog.