phpbar.de logo

Mailinglisten-Archive

[php] header("Location: ..."); sofort zur Anwendung bringen

[php] header("Location: ..."); sofort zur Anwendung bringen

Frank Rasche phpml at raschesweb.de
Mi Jul 13 17:29:25 CEST 2011


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