Selbst entpackendes Archiv in PHP
Flavius Kehr
- php
Hallo allerseits!
Folgendes Problem:
Für einen Kunden soll es möglich sein, eine "personalisierte" Exe-Datei auszuführen. Da PHP wohl kaum imstande ist, eine Exe-Datei zu kompilieren, habe ich mir überlegt, dem Kunden ein Paket aus der Exe-Datei und einer Datendatei zu erstellen, die die relevanten personalisierten Daten enthält, so dass er den Anschein hat, ein auf ihn zugeschnittenes Programm zu erhalten.
Allerdings sollte das für den Kunden möglichst einfach ablaufen und ohne zusätzliche Programme (z.B. Winzip) funktionieren.
Ideal wäre also ein selbst entpackendes Archiv, das am allerbesten noch die Anwendung direkt startet, so dass der User das Gefühl hat, mit einem Mausklick die Anwendung starten zu können. Nun konnte ich auf meiner Suche durch die Weiten des Internets aber keine Bibliothek entdecken, die das zu leisten imstande ist.
Eine Möglichkeit bestünde, wenn man per PHP externe Programme wie GZip "fernsteuern" würde. Wesentlich geschickter wäre das aber natürlich mit "echten" PHP-Befehlen.
Ist es möglich, in PHP selbst entpackende Archive zu erstellen?
Wenn ja, wie?
Für eine Antwort wäre ich sehr dankbar!
Gruß
F. Kehr
Hallo Flavius,
Für einen Kunden soll es möglich sein, eine "personalisierte" Exe-Datei auszuführen.
warum muss es eine "exe"-Datei sein?
Warum willst Du unbedingt PHP für diese Aufgabe missbrauchen?
Warum greifst Du nicht zu einer Express-Edition von Microsoft:
- Visual C++
- C#
- VB
- ...
und erstellst das, was der Kunde gerne haben möchte (so wie ich Dich verstehe):
Eine native Windows-Anwendung.
Natürlich böte sich auch hier gerne der Windows Scripting Host mit solchen
Sprachen wie Python, JScript oder VB-Script an.
Auf die Idee, PHP für den im ersten Satz angesprochenen Zweck zu verwenden,
käme ich überhaupt nicht.
Und ja, selbstverständlich kann PHP externe Programme aufrufen,
selbstverständlich kann PHP auch mit eigenen Funktionen auf zip-komprimierte
Daten zugreifen, aber das hast Du ja bestimmt schon selbst im Handbuch
gefunden.
Zum Abschluss möchte ich Dir nochmals sagen, dass meiner Meinung nach PHP
für diese Aufgabe das falsche Werkzeug ist.
Freundliche Grüße
Vinzenz
Hallo!
Ich denke da hast du etwas falsch verstanden.
Die Exe-Datei wird selbstverständlich in einer "nativen" Programmiersprache geschrieben (VB um genau zu sein).
PHP wird aber gebraucht, da es konkret um eine Testsituation geht, die folgendermaßen aufgebaut ist:
1. Der erste Teil des Tests findet online über ein PHP-Skript statt.
2. Der zweite Teil des Tests soll offline in Form einer EXE stattfinden.
Allerdings soll dieser Teil mit den Daten des ersten Teils gefüttert sein.
3. Die Daten des zweiten Teils werden anschließend wieder hochgeladen, so dass die Auswertung wiederum in PHP geschehen kann.
Das Ganze muß leider so funktionieren, da die Realisierung des zweiten Testteils eine Vollbildanwendung erfordert, bei der die Reaktionszeiten millisekundengenau gemessen werden müssen - hierzu eignet sich meines Wissens keine Webanwendung (es sei denn man arbeitet mit ActiveX oder ähnlichem Schwachsinn - wirklich saubere Lösungen gibt es hier denke ich nicht).
Mein Problem liegt also im zweiten Punkt:
Wie schaffe ich es, die Daten des ersten Testteils so mitzuliefern, dass die Exe-Datei diese auslesen kann?
Meine Idee war es, neben der Exe-Datei eine weitere Datei mitzuliefern, die die relevanten Daten aus dem ersten Testteil enthält. Das kann dann von der Exe ausgelesen werden. Die beiden Dateien (Exe und die Ergebnisse des ersten Testteils) müsste man dann also als Archiv zusammenfassen.
An sich soweit kein Problem, geschickt und vor allem benutzertauglicher fände ich es aber, wenn das Ganze selbstextrahierend wäre.
Und am allergeschicktesten wäre es, wenn dieses selbstextrahierende Archiv nicht über irgendwelche shell_exec-Befehle zustande kommen würde (auch und vor allem weil ich nicht weiß, welche Anwendungen auf dem Webserver installiert sind und ich nicht überall Zugriffsrechte habe) sondern eben über "native" PHP-Befehle....
Daher meine Anfrage:
Gibt es eine Möglichkeit, über "reine" PHP-Befehle ein selbstextrahierendes Archiv zu erstellen?
Ich hoffe der lange Text schreckt nicht zu sehr vom Lesen ab, sondern fördert vielmehr das Verständnis für das Problem :)
Viele Grüße
Flavius Kehr
Moin Moin!
Mein Problem liegt also im zweiten Punkt:
Wie schaffe ich es, die Daten des ersten Testteils so mitzuliefern, dass die Exe-Datei diese auslesen kann?
Laß die EXE-Datei sich die Daten selbst besorgen, per HTTP-Request an das PHP-Script. Dafür brauchst Du nur eine kurze ID, die im ersten Teil angelegt wurde, z.B. eine Hand voll Buchstaben. Die muß der Kunde einmal aus der letzten PHP-Testseite eintippen.
Wahlweise kannst Du die EXE-Datei auf dem Server kopieren und die Kopie mit der ID patchen, dafür compilierst Du in die EXE-Datei einfach eine String-Konstante oder String-Resource mit einem auffälligen und seltenen Marker (sowas wie "***20080208FlaviusKehrPatchMyDataIDHere***") rein, den PHP sucht und überschreibt. (Sollte Windows mittlerweile Prüfsummen in EXE-Dateien ernsthaft prüfen, fällt das natürlich auf die Nase.)
Wenn Du ein selbstentpackendes Archiv ausliefern willst, sieh Dir mal Info-ZIP an. Du packst mit PHP-Bordmitteln oder Infozip Deine EXE-Datei und eine kundenspezifisch generierte Daten-Datei (INI, XML, ...) sowie alle weiteren benötigten Resourcen in eine ZIP-Datei, dann erzeugst Du aus der Datei mit InfoZIP ein Windows-SFX.
Alexander
Moin Moin!
Laß die EXE-Datei sich die Daten selbst besorgen, per HTTP-Request an das PHP-Script.
URLDownloadToFile(NULL,url,filename,0,NULL) sollte dafür ausreichen, funktioniert ab WinNT 4.0 und Win95, jeweils mit IE 3.0.
Alexander
Hey!
Vielen Dank für die hilfreichen Ratschläge!
Das mit dem HTTP-Request ist gar keine schlechte Idee, wäre als Alternative zu überlegen.
Da das Programm aber möglichst benutzertauglich sein soll (also nix mit zusätzlichen Codes bei denen man sich vertippen kann usw. - One Click und los gehts) und zudem der Testablauf so wenig wie möglich beeinflusst/gestört werden sollte, denke ich, ich bevorzuge noch immer die Zip-Variante.
So wie ich das sehe benötige ich hierfür aber in jedem Fall ein externes Programm, dass ich per shell_exec aus PHP ansteuern muß... tjoa... dann muß ich mich mal mit dem Webserveradmin auseinandersetzen :)
Vielen Dank trotzdem!
Flavius Kehr
Moin Moin!
So wie ich das sehe benötige ich hierfür aber in jedem Fall ein externes Programm, dass ich per shell_exec aus PHP ansteuern muß... tjoa... dann muß ich mich mal mit dem Webserveradmin auseinandersetzen :)
Mit ein wenig Glück nicht. Wenn die ZIP-Library von PHP tolerant genug ist, "leading garbage" in einer ZIP-Datei zu ignorieren und intakt zu lassen, kannst Du das SFX in aller Ruhe offline zusammenbauen und auf den Server legen. Kundenspezifisch machst Du dann von dem SFX eine Kopie, fügst per ZIP-Library die Konfiguration hinzu, und lieferst die veränderte SFX-Kopie ganz normal aus.
Der ganze Trick bei ZIP-SFXen ist, das ZIP-Dateien den eigentlichen Header am Ende der Datei liegen haben, der Entpackcode wird der ZIP-Datei einfach vorangestellt. Deswegen kann man auch beliebige ZIP-Archive per pkunzip & CO. entpacken, ohne den SFX-Code laufen zu lassen.
Alexander
Der ganze Trick bei ZIP-SFXen ist, das ZIP-Dateien den eigentlichen Header am Ende der Datei liegen haben, der Entpackcode wird der ZIP-Datei einfach vorangestellt. Deswegen kann man auch beliebige ZIP-Archive per pkunzip & CO. entpacken, ohne den SFX-Code laufen zu lassen.
Alexander
Hey das ist ja mal genial! Wenn das klappt, kriegst du nen virtuellen Kuss von mir ;)
Herzlichen Dank!
So. Habs mal ausprobiert, funktioniert aber leider nicht.
Manuell klappt das alles, aber mit PHP eben nicht.
Eine einfache Lösung ist mir noch gekommen:
Abfrage der relevanten Daten über einen HTTP-Request und den benötigten Code in den Exe-Dateinamen schmuggeln. Ist zwar nicht unbedingt die eleganteste Lösung, weil wer lädt sich schon gern Dateien runter die 45anvasdria5.exe heißen, aber sie müsste funktionieren...
echo $begrüßung;
Da PHP wohl kaum imstande ist, eine Exe-Datei zu kompilieren, [...]
Das Kompilieren geht sicher nicht (mit Boardmitteln), aber prinzipiell kann man jede Art von Datei erzeugen, wenn die dazu benötigten Daten bekannt sind.
Ist es möglich, in PHP selbst entpackende Archive zu erstellen?
Eine Exe-Datei kann ja nicht nur Programmcode enthalten, sondern auch Ressourcen, wie Icons, Tabellen mit Strings, Daten, die ein komprimiertes Archiv darstellen. u.v.a.m. Wenn du also nach Informationen über den Aufbau von Exe-Dateien im Allgemeinen und dem von selbst entpackenden Archiven im Besonderen suchst, denke ich, solltest du in den Weiten des Internets fündig werden. Mehr als diesen "Wegweiser" kann ich dir aber mangels diesbezüglichen Wissens nicht hinstellen.
echo "$verabschiedung $name";