# tar.gz entpacken auf Webserver



## Loki2 (30. Juli 2007)

Hallo,

ich habe ein Problem mit dem entpacken eines tar.gz archives auf meinem Webserver. Ich habe bisher keinen funktionierenden Weg gefunden.
Das was bisher am besten funktioniert hat war das Tutorial Dekompression mit PHP allerdings bekomme ich da nach 60 Sekunden ein Timeout und das entpacken wird abgebrochen. PclZip und PEAR:ackage::Tar funktionieren bei mir überhaupt gar nicht.
ZipDeploy funktioniert auch nicht :-(

Hat noch jemand eine Idee wie ich das Archiv sonst entpackt bekomme oder wie ich das Tutorial anpassen muss damit kein Timeout kommt?

Vielen Dank.

Gruß und so
Loki2


----------



## Iches (30. Juli 2007)

Du könntest den Timeout in deiner php.ini ändern.


----------



## Loki2 (30. Juli 2007)

Nein kann ich leider nicht da ich nicht an die PHP ini dran komme.

Ist ja nicht mein Server, ich habe auf dem Server nur Webspace gemietet.


----------



## Dennis Wronka (30. Juli 2007)

Nach dem Script hab ich das Ganze auch mal als Klasse umgesetzt. Die kannst Du hier finden.
Hab auch mal fix was rumgetestet und die Klasse scheint um einiges schneller zu sein.
Funktion:


			
				time php uncompress.php eyeOS_1.0.3.tar hat gesagt.:
			
		

> real    0m4.720s
> user    0m4.292s
> sys     0m0.388s


Klasse:


			
				time php test.php eyeOS_1.0.3.tar hat gesagt.:
			
		

> real    0m0.072s
> user    0m0.048s
> sys     0m0.024s


Das ist insofern auch sehr interessant da die Datei in der Klasse immer wieder geoeffnet und geschlossen wird, wobei in der Funktion nur einmal geoeffnet und eben am Ende geschlossen wird.
Moeglicherweise liegt es daran dass die Dateinfos gleich zu Beginn gelesen werden und nicht erst beim Entpacken ausgewertet werden muessen. Einen anderen Grund wuesste ich jetzt nicht.

Mit ein paar Archiven hatte ich mit der Klasse aber Probleme, es wurden scheinbar nicht alle Dateien entpackt. Beim Beispiel oben wurde aber alles entpackt, mal davon abgesehen dass ich die Verzeichnisstruktur mit

```
mkdir -p eyeOS/img
```
manuell anlegen musste da es scheinbar keine Eintraege fuer die Verzeichnisse im Archiv gab.

An der Klasse muss ich also wohl noch ein wenig was machen. Allgemein scheint diese aber die weitaus schnellere Variante darzustellen.


----------



## Big-Tux (30. Juli 2007)

Wenn der Server nicht im "safe_mode On" läuft sollte folgendes funktionieren:


```
set_time_limit(0);
```

am Anfang des Scriptes setzen...

[edit]
ich habs mir überlegt, lieber doch


```
set_time_limit(900);
```

sollte in dem Fall dann ne Laufzeit von 15min sein, dann knallts dir auch net den Server weg wenns mal wirklich nen Fehler sein sollte und das Script unendlich weiter läuft...
[/edit]


----------



## Loki2 (30. Juli 2007)

Vielen Dank für die Antworten.

@Dennis Wronka: Wie benutze ich denn diese Klasse? Ich habe nicht sooo viel Erfahrung mit PHP.

@Big-Tux: Das funktioniert leider nicht. Es passiert einfach gar nichts. Also der Browser lädt und lädt und lädt und lädt aber es wird nichts entpackt


----------



## Dennis Wronka (30. Juli 2007)

Hier mal das Script welches ich vorhin zum Testen genutzt habe.

```
<?php
require_once('untar.class.php');
if (isset($argv[1]))
	{
		$archive=$argv[1];
		$tarfile=new untar($archive);
		$filelist=$tarfile->getfilelist();
		for ($x=0;$x<count($filelist);$x++)
			{
				if ($filelist[$x]['filetype']=='directory')
					{
						mkdir($filelist[$x]['filename']);
					}
				else
					{
						$file=fopen($filelist[$x]['filename'],'w');
						$data=$tarfile->extract($filelist[$x]['filename']);
						fwrite($file,$data);
						fclose($file);
					}
			}
		unset($tarfile);
	}
?>
```
Da ich in der Shell gearbeitet habe hab ich mit $argv[1] gearbeitet.
Fuer Dich duerfte der Code ab *$tarfile=new untar($archive);* interessant sein. $archive ist lediglich der Dateiname des zu entpackenden Tar-Files.
Nachteil hierbei ist, dass im Gegensatz zum anderen Script .gz- oder .bz2-Kompression nicht beruecksichtigt werden und man auch selbst Verzeichnisse anlegen und Dateien schreiben muss da die Klasse nur die Daten aus der Datei holt.


----------



## Loki2 (30. Juli 2007)

Verstehe ich das richtig? Alle Dateien aus dem Archiv werden in ein Verzeichnis geworfen ohne die Ordnerstruktur in dem Archiv beizubehalten? Dann kann ich das leider nicht nutzen, das ist zuviel als das ich es per Hand wegsortieren könnte


----------



## Big-Tux (30. Juli 2007)

Dann könntest du rein Theoretisch noch folgendes Probieren:


```
ini_set('max_execution_time', '300');
```

wobei die 300 jetzt 5min laufzeit wären...


----------



## Dennis Wronka (30. Juli 2007)

Nein, Verzeichnisse werden erstellt und auch genutzt, vorausgesetzt die Eintraege sind richtig im Archiv.

Am besten schaust Du Dir mal die Filelist an, dann sollte einiges klarer werden.

```
<?php
//$archive belegen
$tarfile=new untar($archive);
var_dump($tarfile->getfilelist());
unset($tarfile);
?>
```


----------



## Loki2 (30. Juli 2007)

OK ich habe das mit der Klasse jetzt mal ausprobiert. Leider passiert überhaupt gar nichts.

Dies ist mein Skript welches ich aufrufe: 


```
<?php
require_once('untar.class.php');
    $archive="gallery2.tar.gz";
    $tarfile=new untar($archive);
    $filelist=$tarfile->getfilelist();
    for ($x=0;$x<count($filelist);$x++)
        {
            if ($filelist[$x]['filetype']=='directory')
                {
                    mkdir($filelist[$x]['filename']);
                }
            else
                {
                    $file=fopen($filelist[$x]['filename'],'w');
                    $data=$tarfile->extract($filelist[$x]['filename']);
                    fwrite($file,$data);
                    fclose($file);
                }
        }
    unset($tarfile);
?>
```
Ist daran noch irgendwas falsch oder was ist los?

Ich muss doch dieses Archiv irgendwie entpackt bekommen, das kanns doch nicht geben.

Vielen Dank für eure super Hilfe hier.


----------



## Big-Tux (30. Juli 2007)

Also nur so als Vorschlag, falls ihr so net weiter kommt, könnte man ja nochmal bei den Funktionen aus dem TUT ansetzen... ein Refresh des Scriptes nach 50sek. sollte ja nicht das Problem sein und soweit ich weiß werden .tar.gz Blockweise ausgelesen... kann man sich nicht irgendwie die Position merken wo man ist, einen Refresh machen, dabei die Position übergeben und da wieder ansetzen wo man vor dem Refresh aufhören mußte?

Ist nur so ne Idee, ich kenn das bei DB-BackUps die etwas größer sind das man das machen kann, vielleicht klappts hier ja auch?

Ich bin leider nicht wirklich der Profi beim entpacken von Archiven mit PHP, ich mach das dummerweise alles über die Shell wenn ich was zu entpacken habe... 

[PS]
Dennis hast du ne Ahnung ob das mit der Erreichbarkeit was mit dem Server oder mit den Knotenpunkten zutun hat?
[/PS]


----------

