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