Caching von vielen Dateien

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von Jakob, 29.10.2006.

  1. Jakob

    Jakob Thread Starter MacUser Mitglied

    Beiträge:
    1.067
    Zustimmungen:
    21
    MacUser seit:
    05.01.2004
    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!
     
  2. Gunter_S

    Gunter_S MacUser Mitglied

    Beiträge:
    150
    Zustimmungen:
    3
    MacUser seit:
    15.03.2004
    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
     
  3. Jakob

    Jakob Thread Starter MacUser Mitglied

    Beiträge:
    1.067
    Zustimmungen:
    21
    MacUser seit:
    05.01.2004
    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?
     
  4. Gunter_S

    Gunter_S MacUser Mitglied

    Beiträge:
    150
    Zustimmungen:
    3
    MacUser seit:
    15.03.2004
    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
     
  5. Jakob

    Jakob Thread Starter MacUser Mitglied

    Beiträge:
    1.067
    Zustimmungen:
    21
    MacUser seit:
    05.01.2004
    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!
     
  6. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.040
    Zustimmungen:
    1.316
    MacUser seit:
    13.09.2004
    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).
     
  7. Jakob

    Jakob Thread Starter MacUser Mitglied

    Beiträge:
    1.067
    Zustimmungen:
    21
    MacUser seit:
    05.01.2004
    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.
     
  8. neuni

    neuni MacUser Mitglied

    Beiträge:
    410
    Zustimmungen:
    15
    MacUser seit:
    20.10.2006
    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...
     
  9. Jakob

    Jakob Thread Starter MacUser Mitglied

    Beiträge:
    1.067
    Zustimmungen:
    21
    MacUser seit:
    05.01.2004
    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.
     
  10. neuni

    neuni MacUser Mitglied

    Beiträge:
    410
    Zustimmungen:
    15
    MacUser seit:
    20.10.2006
    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.
     
Die Seite wird geladen...

Diese Seite empfehlen