UnTar mit PHP

Dennis Wronka

Soulcollector
So liebe Leute, ich hab mir mal wieder was ganz besonderes einfallen lassen.
Und zwar ein PHP-Script welches .tar-Archive entpackt.

Das ganz hatte ich mir ueberlegt quasi in einem Installationsscript fuer Websites zu nutzen.
Also, Install-Script hochladen, .tar(.gz)-Archiv hochladen, Install-Script ausfuehren, gluecklich sein.

Mit der Arbeit mit gZip-Archiven in PHP hab ich mich ja schon beschaeftigt, daraus ist dieses kleine Script entstanden.
Jetzt ist es mit gZip ja noch recht einfach, da dieses von PHP unterstuetzt wird, anders sieht es jedoch mit TAR aus. Da gibt es keine schicken Funktionen fuer.
Natuerlich koennte man das alles ueber einen einfachen Shell-Aufruf via exec() oder system() regeln, aber das waere ja zu einfach, und oft auch aus SafeMode-Gruenden nicht machbar.

Darum hab ich einfach mal ein paar .tar-Archive erstellt und geschaut was dabei so rumkommt.
Das Ergebnis ist schon garnicht schlecht, aber auch noch nicht wirklich gut, denn bisher kann mein Script nur Archive entpacken die ausschliesslich reine Textfiles beinhalten. Sobald irgendwelche Binaer-Files (wie z.B. Bilder) in's Spiel kommen gibt es das groesste Durcheinander seit erscheinen des letzten Harry Potter Buches.

Nun ja, lange Rede wenig Sinn: Das folgende Script ist also dazu gedacht .tar-Archive zu entpacken.
Und wie gesagt, fuer reine Text-Dateien funktioniert das auch ganz gut, auch Unterverzeichnisse werden erstellt und Dateien dort hinein gelegt.

untar.php
PHP:
<?php
if (isset($_GET['tar']))
	{
		$tarfile=fopen($_GET['tar'],"r");
		$value=0;
		$c=chr(0);
		$tarcontent=array();
		while (feof($tarfile)==false)
			{
				$tarcontentvalue="";
				while ((ord($c)==0) && (feof($tarfile)==false))
					{
						$c=fgetc($tarfile);
					}
				while ((ord($c)!=0) && (feof($tarfile)==false))
					{
						$tarcontentvalue.=$c;
						$c=fgetc($tarfile);
					}
				$tarcontent[]=$tarcontentvalue;
			}
		$tarfile=fclose($tarfile);
		$count=0;
		while ($count<count($tarcontent))
			{
				if (substr($tarcontent[$count],-1)=="/")
					{
						echo "Creating ".$tarcontent[$count]."<br>";
						mkdir($tarcontent[$count]);
						$count+=13;
					}
				elseif (!empty($tarcontent[$count]))
					{
						echo "Extracting ".$tarcontent[$count]."<br>";
						$newfile=fopen($tarcontent[$count],"w");
						fwrite($newfile,$tarcontent[$count+13]);
						$newfile=fclose($newfile);
						$count+=14;
					}
				else
					{
						$count++;
					}
			}
	}
?>

Jetzt wollte ich Euch einfach mal bitten mit mir zusammen nach der Moeglichkeit zu suchen dieses Script universell zu gestalten. Sodass jede Art von Datei extrahiert werden kann.

Vielleicht faellt ja jemandem was dazu ein.

Viel Spass, und viel Erfolg.
Falls ich Fortschritte mache werde ich diese natuerlich hier bekannt geben.
 
Hallo!

Du willst das Script universell gestalten?
Und was machst Du wenn das Script auf einem Windows Server laufen soll?! :p
Warum versuchst Du es nicht mit PclZip, damit soll man auch entpacken können.
Gruss Dr Dau
 
Das mit dem Packen/Entpacken mittels gZip funktioniert ja schon.
Okay, entpacken hab ich noch nicht probiert, aber da in gZip immer nur eine Datei gepackt werden kann wird das entpacken wohl genauso einfach sein wie das packen. Und das hab ich ja im verlinkten Script erfolgreich bewaeltigt.

Das Script wird unter Windows genauso laufen. Ich mach mir ja grad den Aufwand nicht den tar-Befehl ueber exec() oder system() aufzurufen. Dieser ist ja in der Regel unter Windows nicht verfuegbar.
Es soll ganz einfach mit PHP-Bordmitteln ein .tar-Archiv entpacken koennen, was ja fuer Archive mit ausschliesslich Text-Dateien schon funktioniert.
Das sollte auch unter Windows keine Probleme machen, auch wenn man unter Windows in der Regel nichts mit .tar-Archiven zu tun hat. ;)

Hauptsaechlich geht es mir bei dem Script darum einfach mal wieder was neues zu machen. Und nicht einfach irgendwas, sondern halt was komplexes. Genauso wie mein Konfigurations-Script fuer IPTables (was noch auf seine Veroeffentlichung wartet, kleiner Wink mit dem Brueckenpfeiler Richtung Admins ;) ).

Allgemein bin ich auch nicht wirklich ein Freund von Komponenten fuer PHP, wenn man's nicht einkompilieren kann will ich's nicht haben. ;)
 
Ich frage mich wie Du unter Win mit *.tar arbeiten willst.
Wenn es mit PHP eigenen Funktionen nicht geht, bleibt dir nichts anders übrig als es in der Form von PclZIP (über 5000 Zeilen Code) zu machen.
Sachen in PHP einzukompilieren ist so eine Sache, nicht jeder hat die Möglichkeiten dazu, daher währe sowas für mich auch uninteressant.
Denn meine Scripte sollen nach möglichkeit auf jedem System verwendbar sein, auch ohne hohe Zugriffsrechte zu haben.
 
Windows hat ja mit dem Archiv selbst nix zu tun, alles laeuft in PHP.
Darum benutze ich ja die ganz normalen Filesystem-Funktionen wie fopen() und fwrite().
Die funktionieren sowohl unter Linux als auch unter Windows. Genau wie mkdir().

Natuerlich kann man unter Windows nicht so einfach .tar-Archive erstellen, aber das soll ja hauptsaechlich was fuer mich werden. Und ich packe meine Archive in der Regel als .tar.gz.
Nur wenn ich mal ein Archiv an Windows-User weitergeben will, oder hier uploaden, mache ich ein ZIP draus.

Mein Script soll ja, wie gesagt, mir PHP-Bordmitteln laufen, keine PEAR-Extensions und auch nichts speziell einkompiliertes. Daher die Filesystem-Funktionen, damit es auch ueberall klappt.

Als erstes will ich es dann soweit kriegen, dass ich alle Arten von Dateien erfolgreich entpacken kann, danach will ich dann implementieren, dass auch die Rechte richtig gesetzt werden.
Wo die Rechte stehen weiss ich auch schon, ich weiss auch was ich dafuer machen muss, aber das hat jetzt erstmal keine Prioritaet. Wichtig ist erstmal, dass auch Bilddateien mit in's Archiv koennen, sodass mit Hilfe dieses Scripts die komplette Website als Archiv auf den Server geladen werden kann.
Das Install-Script entpackt dann das Archiv, erstellt die Datenbank und loescht dann das Archiv.

:offtopic:
So, jetzt muss ich aber mal ganz drastisch in's Bett. Ist kurz vor 4 in der Frueh, und um 8 schellt schon wieder dieser nervige Plastikding. :(
 
Wenn es denn mit den üblichen Funktionen machbar ist, ist es ja OK.

Unter Windows kann man so einige Archivformate nicht ohne weiteres erstellen/entpacken. ;)

Da hast Du recht, die Rechte spielen nur eine untergeordnete Rolle, was bringen die so lange der Rest nicht hinhaut. ;)

[off] Dann mal gute Nacht. [/off]
 
So, neuer Tag, neuer Code.
Mal sehen ob ich heute irgendwelche Fortschritte beim Script machen kann.

Und ich bin weiter mal gespannt was dieser Thread noch so hervorbringt. :)
 
Hmm, dass einzige was ich immer wieder finde, sind Sachen mit exec() bzw. shell_exec(), das ist natürlich die schlechtere Wahl.
Das Interesse ganze Verzeichnisse zu packen/entpacken ist auf jedenfall weit verbreitet.
Aber immer sind irgendwo Stolpersteine dabei.
 
Und fuer mich liegt der Stolperstein im Moment bei den Bildern und anderen Binaerdateien.
Wie gesagt, fuer Archive mit ausschliesslich Textdateien, gern auch in Unterverzeichnissen, funktioniert es bereits.
 
So, Nase voll....
Ich habe es jetzt mal mit PclZIP versucht, als Testobjekt habe ich deine Gallery inkl. Bilder genommen.
Ergebins: es lässt sich sowohl alles packen ( create() ), als auch entpacken ( extract() )..... einfach nur das Verzeichnis welches gepackt werden soll, auswählen und gut ist.
Zum entpacken das *.zip auswählen und gut ist.

Sicherlich ist es schöner wenn man selbst was auf die Beine stellt, aber warum soll man nicht den einfacheren Weg gehen?!
 
Zurück