Mailinglisten-Archive |
On 13.07.2011 16:29, "Mario Haßler" wrote:: >> Grundsätzlich solltest du dein Design überdenken. >> 20-40 Sekunden um ein Bild zu generieren und das noch als >> Webserver-Request? Nee... > > Das liegt nicht an mir, sondern an dem (externen) Dienst, der den > Webseiten-Schnappschuss generiert. Der muss eine Karenzzeit eingebaut > haben, die lange genug ist, damit die Webseite, die abgebildet werden > soll, alle Elemente (HTML, Text, Bilder, ...) liefern konnte. Mir gings eher darum, das es ungünstig ist ein Script mit so langer Laufzeit auf einer Webseite zu haben. Wenn du erfolgreich bist und viele User-Requests reinbekommst, kannst du so schnell deinen Server überfordern und lahmlegen. >> [...] Dein Script könnte ein CLI im Hintergrund aufrufen und dort das >> Bild generieren lassen, ohne das der Request beeinträchtigt wird. > > Ich weiß nicht, wie ich Hintergrund-Prozesse anstoßen kann. So? > > passthru("/usr/bin/php /path/to/script.php ".$parameters. > " >/dev/null 2>/dev/null &"); ja, ist eine Möglichkeit. Gibt einige Beispiele für exec(), system() im PHP Manual, aber o.g. sollte es schon tun Hat aber auch einen Haken. Wenn ein Bild veraltet ist und viele User klicken darauf, dann startest du viele Prozesse, die dieses Bild neu generiert und 20-40 Sekunden ist ne lange Zeit, bei der viele User klicken könnten... Hier hilft nur ein Locking-Mechanismus, der garantiert das Bild X nur einmal generiert wird, auch wenn da 50 User requests die Generierung anstossen wollen. > ... Wofür steht "CLI"? Abkürzung für Command Line Interface, d.h. du rufst PHP auf der Konsole auf. >> Du könntest einen Cronjob regelmässig nach alten Bildern suchen lassen >> und diese asynchron erneuern. > > Stimmt. Die Aktualisierung je nach Zugriff auf das jeweilige Bild hat > allerdings den Charme, dass selten aufgerufene Bilder auch nur selten > aktualisiert werden. > >> Du könntest, sobald dein Request ein veraltetes Bild findet, dieses >> einer Queue hinzufügen und die dann regelmässig abgearbeitet wird. > > Das würde den Cronjob mit Aufrufhäufigkeit verbinden, ist mir aber zu > viel Aufwand im Handling. muss nicht aufwändig sein, du kannst es auch einfach halten. Der User-Request findet ein altes Bild und schreibt den Identifier (Name des Bildes oder Id oder was du da benutzt) bspw. in eine DB. Ein regelmässiger Cronjob liest diese Tabelle aus, erneuert das Bild und löscht anschliessend den Eintrag in der Tabelle. Du musst nur daran denken, das ein Bild nicht mehrfach in der Queue eingetragen wird. Mittels UNIQUE-Key auf die Spalte mit dem Bild-Identifier sollte das aber kein Problem sein. Wenn du die Möglichkeit eines Cronjobs hast, dann würde ich diesen Weg gehen. Lässt sich später auch noch relativ einfach abändern, bspw. wenn man die Generierung auf einen anderen Server auslagern will (mittels Gearman o.ä.) HTH Frank
php::bar PHP Wiki - Listenarchive