[PHP] Dynamische plaatjes cachen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 15:18

WhiteDog

met zwarte hond

Topicstarter
Ik genereer momenteel met een PHP script dynamisch plaatjes. De plaatjes worden aangeroepen als een png en met RedirectMatch doorgesluisd naar een PHP Script. Dit php script genereert dan het plaatje en output deze naar bv. de browser.

code:
1
RedirectMatch /statsbar/(.*)\.png /statsbar/image.php/$1


Omdat de meeste plaatjes eigenlijk maar om de paar uur veranderen leek het me wel handig om deze te gaan cachen. Ik zou dus een nieuw plaatje genereren zodra er nieuwe data aangeleverd worden.

Nu vraag ik me volgende dingen af:
- Verwijder ik de RedirectMatch en plaats de plaatjes op de virtuele locatie van nu?
- Wat gebeurt er als er een plaatje opgevraagd word net als ik deze aan het overschrijven ben?

Ik dacht dus aan het volgende:
1. Ik schrijf de plaatjes zodra er nieuwe data aangeleverd wordt.Ik hoef de data in principe dus ook niet meer in een database op te slaan.
2. als er een nieuw plaatje genereerd moet worden, laat ik het oude even staan. Ik verwijder de oude pas zodra de nieuwe af is.
3. ik behoud de RedirectMatch. ik kijk dan of er 1 of 2 plaatjes zijn (2 indien nog aan het schrijven) en neem dan de oudste van de 2.
4. Ik laad het plaatje en sluis het door naar de browser.

Ik vroeg me nu af of diteigenlijk niet meer overhead gaat creëren dan er nu al gebeurt. Zijn er manieren om ervoor te zorgen dat een plaatje niet uitgelezen wordt terwijl het beschreven word (ik herriner me flock in perl, alleen werkte dat niet altijd even goed).

Iemand die ervaring heeft met plaatjes cachen en een beter idee heeft?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zou je Redirect gewoon laten staan inderdaad, en in je PHP-script een file opslaan die je kunt fpassthru-en. Wanneer die file er staat en hij is jonger dan x uur, dan laat je die file gewoon zien. Wanneer die file er niet staat of hij is ouder, dan genereer je hem eerst en sla je hem op onder dezelfde naam, om hem vervolgens weer te geven. Concurrencyproblematiek lijkt me erg zeldzaam, en àls het in dit concept voorkomt, dat betekent dat niet veel meer dan dat er twee keer achter elkaar naar die file geschreven wordt. Big deal. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 15:18

WhiteDog

met zwarte hond

Topicstarter
-NMe- schreef op maandag 24 april 2006 @ 20:06:
Ik zou je Redirect gewoon laten staan inderdaad, en in je PHP-script een file opslaan die je kunt fpassthru-en. Wanneer die file er staat en hij is jonger dan x uur, dan laat je die file gewoon zien. Wanneer die file er niet staat of hij is ouder, dan genereer je hem eerst en sla je hem op onder dezelfde naam, om hem vervolgens weer te geven. Concurrencyproblematiek lijkt me erg zeldzaam, en àls het in dit concept voorkomt, dat betekent dat niet veel meer dan dat er twee keer achter elkaar naar die file geschreven wordt. Big deal. ;)
Dat is een hele goeie oplossing, alleen moet er bij nieuwe data ook een nieuw plaatje gemaakt worden. Het gaat bv. om een signature bar die toont welk liedje je momenteel speelt in winamp. Daar kan je geen uur mee wachten :)

Wat echter wel als aanvulling kan op jouw oplossing:
1. Bij aanleveren van nieuwe data verwijder ik het gecachete plaatje
2. als het plaatje dan een keer opgevraagd wordt genereer ik het gewoon. als het dan bv. 5x opgevraagd word (signature op een forum) word het dus 1x gegenereerd en de volgende keren uit de cache gehaald.

Ik vraag me nu alleen nog af of ik hiermee dus effectief snelheidswinst ga halen. Het gaat namelijk om vrij kleine plaatjes waarvan ik een template laad en er tekst op zet. Het gaat dus niet om het genereren van gigantische bitmaps ofzo :P

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

WhiteDog schreef op maandag 24 april 2006 @ 21:09:
Ik vraag me nu alleen nog af of ik hiermee dus effectief snelheidswinst ga halen. Het gaat namelijk om vrij kleine plaatjes waarvan ik een template laad en er tekst op zet. Het gaat dus niet om het genereren van gigantische bitmaps ofzo :P
je bespaard iig cpu load ;)
zelf doe ik ook iets dergelijks met plaatjes cachen, ik haal de gegevens uit de database en vergelijk die met de vorige keer (in mijn geval een md5 hash, moet er nog steeds een timestamp van maken) is er wat veranderd dan maak ik het plaatje opnieuw, en anders haal ik hem uit de cache.
In jouw geval zou ik btw ook gewoon wat extra caching headers toevoegen zodat het plaatje ook niet bij elke hit gedownload hoeft te worden :)

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

In jouw geval zou ik btw ook gewoon wat extra caching headers toevoegen zodat het plaatje ook niet bij elke hit gedownload hoeft te worden
Ik denk dat daar de meeste winst mee te behalen is. Uiteraard zou ik plaatjes ook cachen door plaatjes op te slaan, maar de client laten cachen is nog veel effectiever.

Denk aan last-modified en ETag