![]() |
[PHP] Images serveren zorgt voor reload
Op mijn website gebruik ik PHP om alle images te serveren. Dat is een gevolg van mijn mod_rewrite regel die *alle* requests redirect naar één PHP script.
Images werken prima, maar bij elke pageview worden alle images steeds ge-reload. Na wat gezocht te hebben met de headers die meegestuurd worden, heb ik het probleem geïsoleerd. Het probleem zit hem in dat Apache bij een 2e pageview van een file een HTTP/1.x 304 Not Modified header mee stuurt in plaats van de images te serveren met HTTP/1.x 200 OK. Dat laatste zorgt ervoor dat bij elke pageview alle images worden gereload, hetgeen veel bandbreedte kan kosten. Bij deze dus een vraag of dat ook anders kan. Ik ben vast niet de enige die images via PHP verwerkt, hoe kan ik dit het beste aanpakken? Een database aanleggen of de images al bekeken zijn lijkt me wat extreem, en dan zou ik sowieso een timeout nodig hebben? Thanks :) |
Waarom doe je dat eigenlijk?
|
zelf de headers meesturen?
|
je zou misschien je header van je images aan kunnen passen..
dus iets van header("Pragma: cache"); Maar dan zou ik ook niet weten.. Al leeft bij mij ook de vraag waarom je het zo doet? :confused: |
Citaat:
Maw, hoe zorg ik voor een goede imagehandler. Moet ik dat écht met een database gaan zitten doen? |
Citaat:
Maar een nadeel is dat je mogelijk meer moet doen, zoals images/files/css etc. |
ehh.. ff denken.. dus je laat één script alles doorsturen..
Maar daar geef je zelf toch headers aan mee toch? Maar plaatjes en pagina's hebben toch sowieso andere headers? Maar die geef je niet mee? Ik vind het idee overigs wel redelijk briljant.. |
Citaat:
Maar hoe doe je dat dan, een "directory" redirecten naar een masterscript ? |
Citaat:
PHP-code:
De handler voor /images/ en /files/ zijn het meest interessant. Bij images zie je dat de content type-header meegestuurd wordt, afhankelijk van de MIME type van de betreffende image, wat weer afhankelijk is van de extensie. Bij de /files/ komt de info wel uit de database, waar ook de MIME type wordt opgeslagen. De functie download: PHP-code:
|
Citaat:
Het lijkt me namelijk niet. De browser ziet het plaatje in de html-pagina, vraagt het plaatje op bij de server, krijgt een 'not modified' melding, maar aangezien de browser het plaatje nog niet in cache heeft, zal deze hem toch gaan downloaden. :) Imo dan ;) |
Citaat:
[edit] Jawel hoor: http://nl3.php.net/switch Dit is toch veel overzichtelijker? Maar iedereen heeft zijn eigen programeerstijl en mening :) [/edit] |
Citaat:
Citaat:
|
Citaat:
Citaat:
Verder zou je ipv substr( $uri, 0, 8 ) imo beter preg_match( '^/images/', $uri ) == 1 kunnen gebruiken. Dit is namelijk makkelijker te programeren en te onderhouden :) Bijvoorbeeld: PHP-code:
Misschien moet je de pattern nog iets aanpassen en ik weet ook niet of het wel werkt, maar het idee lijkt me duidelijk ;) |
Ik neem aan dat je dat via htaccess oid hebt geregeld..
Is het dan niet makkelijker om te zorgen dat als een dir niet bestaat, hij dan pas redirect naar een script? Of als dat niet kan, dat je mappens als images/ uitsluit van doorsturen? (het idee an: voorkomen is beter dan genezen :p) |
Citaat:
Citaat:
De switches kan ik echter wel zo doen, is idd mooier en overzichtelijker. :) |
Citaat:
En al zou ik toegang bieden, dan valt er niets op /computers/ te halen. Mijn website is 100% database driven. Alle content staat in de database, alles. Behalve de site layout (head.php en foot.php). Het enige wat ik zou kunnen doen, is de mod_rewrite regel een uitzondering laten bieden voor /images/ Maar dat doe ik liever niet, tenzij het écht niet anders kan. En het kan zeker weten anders. ;) |
je moet een Cache-Control header sturen
zie http://www.w3.org/Protocols/rfc2616/...4.html#sec14.9 |
Citaat:
|
Citaat:
En ik snap het voordeel van beiden niet. Waarom zou je in je url /computers willen hebben als je niet eens een map hebt met computers? Het voordeel van mappen is toch juist dat je alles netjes structureerd, niet dat je je visitors om de tuin leidt? |
Citaat:
|
Citaat:
www.fluffles.net/computers/hardware Staat toch een stuk mooier dan: http://www.fluffles.net/index.php?gr...&view=hardware (Om een voorbeelds te geven :)) je gefet dus al zelf het antwoord op de vraag :) |
Citaat:
Wat maakt het uit dat er fysieke toegang is tot een images map? Gewoon opendir disablen en klaar.. |
Maar kun je met zo'n url nog wel de GET variabelen pakken? Zoals in het voorbeeld van Tril.
|
Citaat:
|
Citaat:
Ik denk dat het probleem in dit geval de Last-Modified header is, volgens mij stuurt PHP standaard altijd de huidige tijd, terwijl je de mod tijd van het plaatje zelf wil sturen. Ik zou 'es kijken of het sturen van een Last-Modified header de zaak oplost. |
Citaat:
stuur als eerste de 304 NOT MODIFIED en onthoudt enkele kenmerken van de browser (sessie oid) die het uniek maakt. Bewaar ook wel plaatje is opgevraagd. Indien er weer een request komt voor hetzelfde plaatje van dezelfde sessie/browser heeft de browser het plaatje niet in cache en kun je dus het gewone plaatje sturen. Hoe het onthouden moet weet ik niet; het lijk me veel read/write access geven op de database of schijf (indien opslaan in bestand of via bestandsnaam)... |
Je wil niet zelf de caching gaan regelen, sessie ID bijhouden heeft ook helemaal geen nut. Je moet zelf zorgen dat je de juiste info stuurt zodat de browser zelf het cachen kan regelen.
|
Nog even over mijn opzet. ********** zei het eigenlijk al, stel we hebben de URL van dit topic:
http://forum.scholieren.com/showthre...hreadid=722786 dat kan ook anders: http://forum.scholieren.com/hardware/722786 de forumnaam gewoon genoemd bij naam en de thread-ID erachteraan. Je faked hier directories, dat is precies wat ik doe. alleen dan voor ALLE URLs op mn site. Voordelen zijn flexibiliteit en managebility, niet eens veiligheid. Alles wordt automatisch voor je gedaan. Als ik /computers/php wil maken hoef ik maar naar node management te gaan en gegevens invullen en de url staat in database, waarna ik berichtjes kan toevoegen. Alles via database dus, komt geen HTML of PHP code bij kijken. Net als de meeste CMS'. |
Citaat:
|
Citaat:
Maar eerst nog even wat proberen voordat ik echt een database aan ga leggen hiervoor. :s |
Interessant:
Citaat:
Ik ga ff wat proberen. =) |
Got it!
Request #1: Citaat:
Citaat:
Te zien valt dat bij de eerste request de server de file gewoon stuurt, en o.a. twee meta-informatie headers meestuurt. De browser herkent deze en stuurt bij een F5 (refresh) de headers If-Modified-Since en If-None-Match en Cache-Control mee. De browser herkent deze en controleert of de file gewijzigd is, dit is niet het geval waardoor een 304 Not Modified meegestuurd wordt. De Date headers zijn niet relevant aangezien deze alleen de datum en tijdstip aangeven van de request/communicatie, geen meta-informatie over de file/URL. *sigh* dit is dus gemakkelijk te implementeren in mijn systeem. :) Alleen moet ik weten hoe de Etag gegenereerd wordt. Woei =) |
Citaat:
|
Hey, Spamslet!
:p |
(y)
Misschien iest voor de FAQ? |
Citaat:
Ik ga wel een centraal-topic sticky topic maken, waarin dus links naar allerlei topics staan, daar zou deze eventueel in kunnen, maar eigenlijk vind ik dit te specifiek daarvoor. |
Ik heb m'n code aangepast, en het werkt! Woei. :cool:
PHP-code:
|
Citaat:
|
@Enlightenment:
Je switch (voor zover ik weet werkend): PHP-code:
|
Citaat:
Er is toch een zoekfunctie.. |
Citaat:
Het is misschien een idee om een soort PHP-topic (of server side scripting - topic) aan te maken waarin (eventueel op aanvraag) links komen naar interessante threads zoals deze, waarin enkele leuke script-voorbeeldjes staan en veel interessante informatie. Het is maar een ideetje, en het zal ook wel z'n nadelen hebben wsl (bijvoorbeeld, wat zet je erin, wat niet). Zoals ik zei, maar een ideetje :) |
Eigenlijk gaan we offtopic,
maar er is al over een PHP sticky gedacht maar dat is niet praktisch.. Er gaan dan scripts door elkaar lopen, aangezien php weleens complex kan worden, kan het dus gaan verwarren.. Met html is dat niet zo.. En wat heb je aan dit script als je het niet specifiek nodig hebt? Niks toch? :p |
Alle tijden zijn GMT +1. Het is nu 02:57. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.