Variable von PHP an Perl übergeben
Anja
- php
0 Sven Rautenberg0 Anja0 Sven Rautenberg0 Anja0 Sven Rautenberg0 Anja
Hallo zusammen,
ich habe eine Site mit php erstellt und möchte nun ein perl-Script "einbauen". Es muss ein perl-Script sein, da sich das Problem mit php nicht lösen lässt.
Nun befülle ich in der php-Datei das Array "$Datei" und möchte dann die perl-Datei aufrufen und das Array übergeben. Ich habe es einmal so versucht:
readfile("http://blabla.de/test/perldatei.pl?Datei=$Datei");
Nur leider wird das Array nicht übergeben. Ich denke einmal, dass readfile die perl-Datei ausschließlich liest und ausführt, aber nichts übergibt.
Leider habe ich nicht so richtig viel Ahnung von perl, so dass ich über einen Tipp sehr dankbar bin. Im Netz und hier im Forum konnte ich bisher auch nichts passendes finden.
Herzliche Grüsse,
Anja
Moin!
ich habe eine Site mit php erstellt und möchte nun ein perl-Script "einbauen". Es muss ein perl-Script sein, da sich das Problem mit php nicht lösen lässt.
Was ist das denn für ein interessantes Problem. Eigentlich dachte ich immer, beide Sprachen sind Turing-komplett, also ließen sich _alle_ Probleme, die man in der einen Sprache lösen kann, auch in der anderen Sprache lösen.
Die Tatsache, dass du PHP verwendest, sollte Grund genug sein, dann doch eher das Problem zu lösen, was angeblich nur mit Perl gelöst werden kann.
Leider habe ich nicht so richtig viel Ahnung von perl, so dass ich über einen Tipp sehr dankbar bin. Im Netz und hier im Forum konnte ich bisher auch nichts passendes finden.
Noch ein gutes Argument, die Sache in Perl zu lösen.
- Sven Rautenberg
Hallo Sven,
Was ist das denn für ein interessantes Problem. Eigentlich dachte ich immer, beide Sprachen sind Turing-komplett, also ließen sich _alle_ Probleme, die man in der einen Sprache lösen kann, auch in der anderen Sprache lösen.
Ich möchte ZIPPEN. Aber die ZIP-Dateien werden sehr groß, so dass das PHP-Script schlapp macht. Aber mit Perl geht's.
Noch ein gutes Argument, die Sache in Perl zu lösen.
Aber wie kommen die Variablen rüber (nach Perl) und am besten auch zurück (nach PHP)??????
Anja
Moin!
Ich möchte ZIPPEN. Aber die ZIP-Dateien werden sehr groß, so dass das PHP-Script schlapp macht. Aber mit Perl geht's.
PHP hat eine konfigurierbare maximale Ausführungszeit pro Skriptaufruf, damit eine Endlosschleife nicht Ewigkeiten lang den gesamten Server beschäftigt. Der Standardwert ist auf 30 Sekunden eingestellt.
Je nachdem, welche Einflußmöglichkeiten du hast, gibt es diverse Lösungsansätze.
Noch ein gutes Argument, die Sache in Perl zu lösen.
Das sollte "PHP" heißen, nicht Perl.
Aber wie kommen die Variablen rüber (nach Perl) und am besten auch zurück (nach PHP)??????
Jedenfalls nicht mit readfile(). Das Problem ist doch, dass PHP nicht so lange laufen darf. Wenn du jetzt entweder mit PHP oder mit einem durch PHP aufgerufenen Perl-Skript die Datei zippst und auf das Ergebnis wartest - für die Zeitdauer ist das egal, es wird dir so oder so das PHP-Skript abgebrochen.
Ich denke, ich kenne dein Problem noch nicht ausreichend genug. Kannst du mal beschreiben, warum du zippen willst, was du da zippst, und wie die ZIP-Datei dann weiterverarbeitet werden soll?
- Sven Rautenberg
Hallo Sven
PHP hat eine konfigurierbare maximale Ausführungszeit pro Skriptaufruf, damit eine Endlosschleife nicht Ewigkeiten lang den gesamten Server beschäftigt. Der Standardwert ist auf 30 Sekunden eingestellt.
Jedenfalls nicht mit readfile(). Das Problem ist doch, dass PHP nicht so lange laufen darf. Wenn du jetzt entweder mit PHP oder mit einem durch PHP aufgerufenen Perl-Skript die Datei zippst und auf das Ergebnis wartest - für die Zeitdauer ist das egal, es wird dir so oder so das PHP-Skript abgebrochen.
AHHH! Das erklärt so einiges!
Ich denke, ich kenne dein Problem noch nicht ausreichend genug. Kannst du mal beschreiben, warum du zippen willst, was du da zippst, und wie die ZIP-Datei dann weiterverarbeitet werden soll?
Ich biete auf meine Site Hörspiel-Cover-Downloads an. Diese sind mit weiteren Angaben zum Cover und dem Dateinamen in einer MYSQL-DB gespeichert. Alle Downloads liegen als ZIP in einem Verzeichnis vor. Ich möchte dem Anwender die Möglichkeit bieten, neben dem Download einzelner Cover auch mehrere Cover auf einmal zu erhalten (damit er nicht so oft klicken muss), packe ich Download-Pakte. D.h. mehrere der ZIP Dateien sollen noch mal bei Bedarf in eine gemeinsame ZIP gepackt werden.
Es können immer andere einzelne ZIP sein und auch die Anzahl der einzelnen ZIP für so ein Paket kann variieren. Daher möchte ich nicht für jedes einzelne Paket ein Script schreiben, sondern ein einziges möglichst flexibles. Da es recht viele Pakete werden können, kann ich diese auch nicht von vorn herein auf dem Server ablegen, da der Webspace nicht ausreicht.
Die Daten aus der DB hole ich mit PHP. Hier würde ich gern ein Array mit allen Downlads erstellen, die im Paket enthalten sein sollen. Wie gesagt, habe ich es bereits erfolgreich geschafft, ZIPs mit PHP zu erstellen. Ich habe dafür die ZIP_Klasse von Eric Mueller / http://www.themepark.com verwendet. Jedoch gelang es immer nur so bis 1,5 MB, dann waren anscheinend die 30 Sekunden abgelaufen. Es sollte aber schon bis ca. 5 MB klappen.
Für das Zippen mit Perl verwende ich Archive::ZIP. Nur hapert es hier mit dem Zusammenspiel von PHP und Perl.
Nach dem Zippen soll das Paket dann an den Anwender geschickt werden. Hier wechsle ich per PHP den Header, das klappt bisher ganz gut. Gelöscht werden die bereits erstellten Pakte auch wieder per PHP und zwar X Stunden nach dem Erstellen des Paktes.
Ich hoffe, ich konnte meine mißliche Lage erklären ;-) Falls die ganze Sache dann einen guten Ausgang nimmt, würde ich auch gern einzelne ZIP die auf einem anderen Server liegen in ein solches Paket mit einbinden oder aber ein gleiches Script auf dem anderen Server anstoßen....
Herzliche Grüsse,
Anja
Moin!
Ich denke, ich kenne dein Problem noch nicht ausreichend genug. Kannst du mal beschreiben, warum du zippen willst, was du da zippst, und wie die ZIP-Datei dann weiterverarbeitet werden soll?
Ich biete auf meine Site Hörspiel-Cover-Downloads an.
Gibts da keine Urheberrechte, die zu beachten wären?
Die Daten aus der DB hole ich mit PHP. Hier würde ich gern ein Array mit allen Downlads erstellen, die im Paket enthalten sein sollen. Wie gesagt, habe ich es bereits erfolgreich geschafft, ZIPs mit PHP zu erstellen. Ich habe dafür die ZIP_Klasse von Eric Mueller / http://www.themepark.com verwendet. Jedoch gelang es immer nur so bis 1,5 MB, dann waren anscheinend die 30 Sekunden abgelaufen. Es sollte aber schon bis ca. 5 MB klappen.
Wenn du mehr Zeit brauchst: Versuche es zuerst mal mit http://de3.php.net/manual/de/function.set-time-limit.php. Funktioniert nicht, wenn dein PHP im Safe-Mode läuft (was es tun sollte, wenn du dir den Server mit anderen Websites teilst.
Mehr als etwa 300 Sekunden Zeitdauer (was ja immerhin 5 Minuten sind) wirst du allerdings kaum herausschlagen können. Denn irgendwann sagt der Webserver dann "Timeout".
Für das Zippen mit Perl verwende ich Archive::ZIP. Nur hapert es hier mit dem Zusammenspiel von PHP und Perl.
Auch Perl wird kaum länger als 300 Sekunden arbeiten können, würde ich vermuten.
Deine Aufgabenstellung schreit eigentlich nach asynchroner Aufgabenerledigung - die sich vermutlich aufgrund deiner Servermöglichkeiten nicht realisieren läßt. Denn im Prinzip bräuchtest du ein im Hintergrund laufendes Programm, welches die Aufgabe erhält, jeweils die benötigten ZIPs zusammenzustellen, und der Interessent kriegt, solange das noch nicht fertig ist, eine Meldung, nochmal in einer Minute vorbeizugucken - und wenn das ZIP fertig ist, kriegt er es geschickt.
Dieser Ansatz ist jedenfalls viel besser, als wenn man eine Ewigkeit auf den Beginn des Downloads warten muß. Da klicke ich dann nämlich doch lieber mehrfach, wenn das schneller geht.
Die Alternative, um aus der Zeitabhängigkeit von PHP herauszukommen: Verwende Perl, indem du eine Perl-URL im _Browser_ aufrufst, nicht in PHP. Das Array bekommst du aber nicht im Stück übermittelt. Du mußt jedes einzelne Element des Arrays als einen Bestandteil des URL-Strings übermitteln.
Also nicht ?array=$array sondern ?elem0=$array[0]&elem1=$array[1]. Erst so kann Perl damit was anfangen.
Nach dem Zippen soll das Paket dann an den Anwender geschickt werden. Hier wechsle ich per PHP den Header, das klappt bisher ganz gut. Gelöscht werden die bereits erstellten Pakte auch wieder per PHP und zwar X Stunden nach dem Erstellen des Paktes.
Der Ansatz ist zwar nett, aber es sollte irgendwie besser zu lösen sein. Man könnte beispielsweise die vorhandenen ZIPs auch dynamisch zu einem neuen ZIP zusammenfügen, indem man einfach nur die richtigen Bytes zwischenfügt. Oder indem man ein tar-File schickt. Damit kann WinZIP auch umgehen. Und tar ist IIRC ein wirklich einfaches Format, in dem die einzelnen Dateien einfach ungepackt (was bei ZIP absolut nicht schlimm ist) hintereinander weg in der Datei stehen - und irgendwo noch ein Inhaltsverzeichnis mit den Dateinamen.
Ich habe aber absolut keinen Schimmer, ob's dafür ein Modul oder eine Klasse für PHP gibt. Außerdem bleibt dann immer noch das Ausführungszeitproblem.
Allerdings: Wann immer so ein Problem auftaucht ist es ein Indiz, dass man die Aufgabe anders angehen _sollte_ (beispielsweise mit der asynchronen Verarbeitung). Das Problem ist halt, dass gewisse Dinge gewisse Konfigurationen und Zugriffsmöglichkeiten auf dem Server erfordern. Und wenn man diese Möglichkeiten hat, kann man fast immer auch einfach die Timeouts hochsetzen, um sich mit anderen Lösungen gar nicht erst zu befassen.
Ich hoffe, ich konnte meine mißliche Lage erklären ;-) Falls die ganze Sache dann einen guten Ausgang nimmt, würde ich auch gern einzelne ZIP die auf einem anderen Server liegen in ein solches Paket mit einbinden oder aber ein gleiches Script auf dem anderen Server anstoßen....
Das dürfte noch schwieriger werden. Außerdem kostet das deinen Traffic - und zwar doppelt: Einmal zum ZIP einlesen, einmal zum Senden. Und da du hier von Megabytes für die Zusammenfassung sprichst, dürfte die Datenmenge relevant werden. Abgesehen davon kann ich mir vorstellen, dass die anderen solch eine Content-Übernahme nicht so gut finden.
- Sven Rautenberg
Hallo Sven,
zuerst einmal herzlichen Dank für deine lange und ausführliche Antwort!!
Wenn du mehr Zeit brauchst: Versuche es zuerst mal mit http://de3.php.net/manual/de/function.set-time-limit.php. Funktioniert nicht, wenn dein PHP im Safe-Mode läuft (was es tun sollte, wenn du dir den Server mit anderen Websites teilst.
Hm, ich teile mir den Server aber (leider). Mein Provider Puretec schreibt in seiner FAQ folgendes zu der Problematik (andere Hinweise zu dem Thema gab's dort nicht):
Folgende Einschränkungen sind technisch festgelegt:
Auch Perl wird kaum länger als 300 Sekunden arbeiten können, würde ich vermuten.
Ich habe eben mal mit dem Perl-Script ein Verzeichnis gepackt. Das erzeugte Zip hatte knapp 6 MB und es dauerte im Durchschnitt 7 Sekunden bis das Zip erzeugt war. Unter der Annahme, dass das Script nicht die komplette Rechenleistung des Servers einnimmt (siehe oben) sollte das doch reichen. Oder habe ich hier etwas nicht bedacht / falsch verstanden?
Wenn ich das so richtig verstanden habe, dann würde ich jetzt mal versuchen wollen, das Perl-Script von PHP aus auszuführen und das Array dabei einzeln zu übergeben.
Das dürfte noch schwieriger werden. Außerdem kostet das deinen Traffic - und zwar doppelt: Einmal zum ZIP einlesen, einmal zum Senden. Und da du hier von Megabytes für die Zusammenfassung sprichst, dürfte die Datenmenge relevant werden. Abgesehen davon kann ich mir vorstellen, dass die anderen solch eine Content-Übernahme nicht so gut finden.
Das habe ich befürchtet! Dann lasse ich den Part erst einmal weg. Zur Content-Übernahme: der andere Server ist auch meiner ;-)
Herzliche Grüsse,
Anja
PS: ich bin der Lösung mittlerweile schon recht nah. Ich test noch etwas und stelle sie hier dann einmal vor.