[PHP] GD, Image, no-cache.

Pagina: 1
Acties:

Onderwerpen


  • Xu
  • Registratie: Maart 2001
  • Laatst online: 29-04 07:47
Hoi ik ben laatst even bezig geweest met PHP maar ben tegen ee probleem aangelopen:

Mijn situatie:
Ik heb een pagina gemaakt met een form. Daarin kun je gewoon text intypen en dat wordt vervolgens opgeslagen als een plaatje.Wat ik nu graag wil is, wanneer ik dat plaatje link.. in een forum of in een ander webpagina, dat het gewoon niet gecached wordt door de browser.

Dus wanneer ik wat verander in mijn formpje qua tekst, dat iedereen als hij mijn plaatje tegenkomt mijn nieuwe tekst kan zien.

Hij werkt nu half goed...


Mijn probleem:
Ik heb gegoogled en de search gebruikt.. ik had wel wat threads gevonden met:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
 
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
?> 


Ik heb dit toegepast, alleen snap ik niet of dit nou ook opgeslagen wordt in een image bestand of niet.

Ik sla mijn plaatje op als md5 bestandsnaam(aan de hand van een username) met de desbetreffende extensie.

Het probleem doet zich voor wanneer ik wat heb gewijzigd als username a en vervolgens na een tijdje(half uur tot een uurtje) wat verander als username b. Het plaatje is wel gewijzigd maar op de andere websites(in mijn browser cache) staat nog steeds het ouwe plaatje(doe ik refresh is het gewoon weer up to date).

Ik heb twee php bestanden:

1 class bestand, hier wordt het plaatje gegenereerd en opgeslagen, hierin bevinden de headers.
ik laat header ('Content-type: image/png') achterwege, omdat het niet wordt terug gestuurd naar de browser(als ik dat niet doe krijg ik een error, dankzij mijn webpaginaatje).

1 php bestand, standaard formpje, en het spreekt dat class aan.

Het is vrij standaard.. niet echt boeiend..

[ Voor 4% gewijzigd door Xu op 23-12-2004 20:40 ]

[AMD XP 2400@2.0GhZ | Asus A7V8X-X | 512 DDR-RAM | Sapphire Ati Radeon 9800 Pro 128 MB | 80GB Maxtor 5400] && [AMD DURON 800@800 | MSI KT266A Pro2 | 256 DDR-RAM | GeForce2 MX/MX400 64MB | 20GB Maxtor 5400]


  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
die headers worden niet opgeslagen in je plaatje maar moet je verzenden voordat je het plaatje verzend naar de ontvangende browser..

edit: als je dus een plaatje opslaat als bestandsnaam heb je niet direct meer wat aan de headers, wat je dan denk het beste kunt doen is loadimage.php maken en dan de juiste afbeelding via session of andere variabele doorgeven.

eerst de headers versturen en vervolgens het plaatje uitlezen (readfile oid) en dan de inhoud van het plaatje weer echo-en (ook even plaatje headers meesturen dan)...

[ Voor 61% gewijzigd door vriesdude op 23-12-2004 20:45 ]

/dev/null


  • Xu
  • Registratie: Maart 2001
  • Laatst online: 29-04 07:47
vriesdude schreef op donderdag 23 december 2004 @ 20:43:
die headers worden niet opgeslagen in je plaatje maar moet je verzenden voordat je het plaatje verzend naar de ontvangende browser..

edit: als je dus een plaatje opslaat als bestandsnaam heb je niet direct meer wat aan de headers, wat je dan denk het beste kunt doen is loadimage.php maken en dan de juiste afbeelding via session of andere variabele doorgeven.

eerst de headers versturen en vervolgens het plaatje uitlezen (readfile oid) en dan de inhoud van het plaatje weer echo-en (ook even plaatje headers meesturen dan)...
Ah, ok ik begrijp het(lekker snel reply).. nu heb ik het volgende idee.. (want met sessie wordt het niet).

Ik ga "clean" url toepassen:
www.site.nl/plaatje/746272372.jpg (i.p.v. www.site.nl/plaatje.php?746272372.jpg).

Links:

http://httpd.apache.org/docs/mod/mod_mime.html#forcetype
http://www.evolt.org/arti..._Apache_and_PHP/18/22880/

[ Voor 16% gewijzigd door Xu op 23-12-2004 21:42 ]

[AMD XP 2400@2.0GhZ | Asus A7V8X-X | 512 DDR-RAM | Sapphire Ati Radeon 9800 Pro 128 MB | 80GB Maxtor 5400] && [AMD DURON 800@800 | MSI KT266A Pro2 | 256 DDR-RAM | GeForce2 MX/MX400 64MB | 20GB Maxtor 5400]


  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
succes, en laat ff weten of het gelukt is

(als je er niet uit komt, ik heb je hotmail adres aan me msn lijst toegevoegd, kun je me altijd ff aanspreken)

/dev/null


Verwijderd

Je kan het ook met de apache module mod_rewrite doen ;) (http://httpd.apache.org/docs/mod/mod_rewrite.html) (moet je alleen wel geluk hebben dat je server het ondersteund, lang niet alle providers hebben dit, dit staat volgens mij in je phpinfo(); )

  • Xu
  • Registratie: Maart 2001
  • Laatst online: 29-04 07:47
dat ... "clean" url is gelukt..

In een andere pagina..

roep ik nu dit op via:
(als voorbeeld)
www.example.com/sig/jpeg/3242425232.jpg

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
$expl = explode("/",$_SERVER['REQUEST_URI']);

// directory + file
$file = '../myimage/'.$expl[count($expl)-1];

if (file_exists($file)) {
  header ('Content-type: image/jpeg');
  $image = imagecreatefromjpeg($file);
  Imagejpeg($image,'',100);
  Imagedestroy($image);
} else {
  header("HTTP/1.1 404 Not Found");
}
?>


Ik heb ff getest op mijn computer en op een laptop.... er is wel een klein cache probleem op mijn computer. Maar volgens mij is er wat mis met me browser(firefox), met IE6 ging het wel goed, op me laptop ging het ook goed (zowel firefox als ie).

[ Voor 63% gewijzigd door Xu op 24-12-2004 00:16 ]

[AMD XP 2400@2.0GhZ | Asus A7V8X-X | 512 DDR-RAM | Sapphire Ati Radeon 9800 Pro 128 MB | 80GB Maxtor 5400] && [AMD DURON 800@800 | MSI KT266A Pro2 | 256 DDR-RAM | GeForce2 MX/MX400 64MB | 20GB Maxtor 5400]


Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
het is dus gelukt als ik het goed begrijp..

wat me opvalt is dat je de image opnieuw create aan de hand van de bestaande image, kost bij veel hits nogal veel performance. je kunt beter readfile oid gebruiken, afbeelding header verzenden en dan de inhoud van readfile weer echo-en... (of printen, net wat de voorkeur is).

/dev/null


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Als je geen 304 header afhandelt, wordt het plaatje iedere keer weer van de server getrokken. Tenminste, dat was mijn ervaring.

Acties:
  • 0 Henk 'm!

  • Xu
  • Registratie: Maart 2001
  • Laatst online: 29-04 07:47
vriesdude schreef op zondag 26 december 2004 @ 20:35:
het is dus gelukt als ik het goed begrijp..

wat me opvalt is dat je de image opnieuw create aan de hand van de bestaande image, kost bij veel hits nogal veel performance. je kunt beter readfile oid gebruiken, afbeelding header verzenden en dan de inhoud van readfile weer echo-en... (of printen, net wat de voorkeur is).
:) ok bedankt voor je tip, ik zat te denken om hierbij nog een extra layer erop te zetten.. om bijv. tijdens kerst een kerstman te laten opduiken.
Maar ik zal een tweede versie maken met behulp van readfile.
Skaah schreef op zondag 26 december 2004 @ 21:03:
Als je geen 304 header afhandelt, wordt het plaatje iedere keer weer van de server getrokken. Tenminste, dat was mijn ervaring.
[message][/message]http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
304 Not Modified

If the client has performed a conditional GET request and access is allowed, but the document has not been modified, the server SHOULD respond with this status code. The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields.

The response MUST include the following header fields:

- Date, unless its omission is required by section 14.18.1

If a clockless origin server obeys these rules, and proxies and clients add their own Date to any response received without one (as already specified by [RFC 2068], section 14.19), caches will operate correctly.

- ETag and/or Content-Location, if the header would have been sent
in a 200 response to the same request

- Expires, Cache-Control, and/or Vary, if the field-value might
differ from that sent in any previous response for the same
variant

If the conditional GET used a strong cache validator (see section 13.3.3), the response SHOULD NOT include other entity-headers. Otherwise (i.e., the conditional GET used a weak validator), the response MUST NOT include other entity-headers; this prevents inconsistencies between cached entity-bodies and updated headers.

If a 304 response indicates an entity not currently cached, then the cache MUST disregard the response and repeat the request without the conditional.

If a cache uses a received 304 response to update a cache entry, the cache MUST update the entry to reflect any new field values given in the response.
Ik zal proberen vanavond hierop te replyen.. (ik update dit wel als ik klaar ben met het lezen van 304 en referenties), ik heb nog geen goed beeld hoe het werkt..

Zeker wanneer ik standaard dit al verstuur:
PHP:
1
2
3
4
5
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");



Het lijkt me dat ik

PHP:
1
2
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");


dit moet wijzigen zodat het overeenkomt met de datum dat het plaatje werdt aangemaakt.. klopt dat?

Skaah kun je misschien een voorbeeld hoe je dat hebt geimplementeerd?

[ Voor 6% gewijzigd door Xu op 29-12-2004 02:39 ]

[AMD XP 2400@2.0GhZ | Asus A7V8X-X | 512 DDR-RAM | Sapphire Ati Radeon 9800 Pro 128 MB | 80GB Maxtor 5400] && [AMD DURON 800@800 | MSI KT266A Pro2 | 256 DDR-RAM | GeForce2 MX/MX400 64MB | 20GB Maxtor 5400]

Pagina: 1