Caching von vielen Dateien

Jakob

Jakob

Aktives Mitglied
Thread Starter
Dabei seit
05.01.2004
Beiträge
1.070
Reaktionspunkte
21
Hallo,

eine eher grundlegende Frage zu PHP:
In meinem Katalog gibt es umfangreiche technische Datenblätter als PDF, die sich dynamisch erstellen. Da das recht langsam ist, würde ich gerne die PDFs schon vorher erstellen und nur bei Änderungen neu berechnen lassen.

Pro PDF braucht er ca. 10 Sekunden und davon gibt es ca. 500. Das sprengt natürlich jedes PHP-Ausführungs-Zeitlimit. Gibt es einen Weg, das trotzdem automatisieren zu können? Danke!
 
Ja das geht, es gibt dazu 4 Grundlegende Möglichkeiten:
1. Du startest für jede PDF einen eigenen PHP-Prozess
2. Du machst es nicht mit PHP
3. Du läßt PHP zB über cronjob laufen und zwar mit einer anderen php.ini, in der die maximale Ausführungszeit hochgesetzt ist
4. Du erlaubst PHP-Skripten in bestimmten Ordnern eine höhere Ausführungszeit (Einstellung in der Apache Konfigurationsdatei):
PHP:
<Directory /Pfad/zu/dem/Ordner>
	php_admin_value max_execution_time 3600
</Directory>

aber keine der Möglichkeiten wird funktionieren, wenn du nicht die benötigten Rechte auf dem Webserver hast.

Gunter
 
Hallo, die erste Möglichkeit hört sich sehr gut an. So etwas hab ich schon länger versucht. Wo kann ich mich denn dazu schlau machen?
 
Das kannst du nicht in einem PHP-Skript machen. Sondern du brauchst eben ein Programm oder einen User der die Skripte "anstößt".

Als Beispiel einen Benutzer der die Webadressen
Code:
http://deineDomain.de/create.php?file=1
http://deineDomain.de/create.php?file=2
http://deineDomain.de/create.php?file=3
usw aufruft.

Um den Aufruf mit Variable zu vermeiden, könntest du auch der Tabelle in der die Daten liegen, eine Spalte "created" hinzufügen. Und dann beim Aufrufen des Skriptes den nächsten, noch nicht gecachten Eintrag, holen und dort den Wert von "created" auf "yes" stellen.

Der Aufruf muss natürlich nicht von einem Benutzer aus geschehen, das kann ja auch ein Skript übernehmen... Mein Favorit wäre dafür cronjob.

Gunter
 
So ähnlich mache ich es schon mit HTML-Dateien, die aus einem langen PHP-Skript erzeugt werden, nur dass da eben der erste User, der auf den Eintrag geht das Skript anstößt. Das ging bei den PDFs nicht, da ich dem User so lange Wartezeiten nicht zumuten kann.
Die Brücke zum cronjob hat mir da gefehlt. Werd mich da mal schlau machen. Danke!
 
Wo kommen denn die Daten für die PDF's her!? Datenbank vermute ich oder?

Dann würde ich doch per crontab ein PHP-Script in der bash starten, daß die Tabelle nach geänderten Datensätzen durchsucht und aus diesen neue PDF's generiert. nat. muß man bei PHP-Skripten in Shells sinnvollerweise die max_execution-Time anheben ( weiß gerade den Namen der Methode dafür nicht mehr).
 
Vielen Dank, funktioniert gut.

Eine kleine Frage zum Schluss: Kann ich ohne cronjob eine PHP-Datei im Hintergrund öffnen, d.h. z.B. ein User klickt auf einen Button, kommt auf eine neue Seite, derweil wird aber ohne das er das merkt im Hintergrund ein anderes PHP Skript gestartet.

include() wäre eine Möglichkeit, aber leider sind dann ja die ganzen relativen Pfadangaben verschoben. Ich würde gerne einfach den Aufruf des Skriptes unter seiner eigenen URL simulieren.
 
Kannst erst aufs Hintergrund-Script verlinken, und in das wiederrum header("Location: anderedatei.php"); machen...kommt halt drauf an wie lange das hintergrund-script braucht...solange hängt die Weiterleitung auf die anderedatei.php dann auch...
 
Ja, das Hängen ist ja das, was ich verhindern wollte. Man könnte es per iframe oder AJAX machen, aber das finde ich zu dreckig in dem Fall. Schade, dass es sonst nicht geht.
 
Naja...ich glaub es gibt da ne Möglichkeit, dass PHP das Script auch ausführt, wenn der Benutzer die Anfrage abbricht...vielleicht kannste das ja irgendwie nutzen. Also kurz das Script anstoßen und dann zu der Seite gehen, die der User sehen soll.
 
neuni schrieb:
Naja...ich glaub es gibt da ne Möglichkeit, dass PHP das Script auch ausführt, wenn der Benutzer die Anfrage abbricht...vielleicht kannste das ja irgendwie nutzen. Also kurz das Script anstoßen und dann zu der Seite gehen, die der User sehen soll.

der entsprechende Funktionsaufruf ist "ignore_user_abort(true);", aber das funktioniert ja auch nur, wenn für das Skript "max_execution_time" ausreichend groß ist.

Gunter
 
Zurück
Oben Unten