Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 15.12.2006, 11:16 Nach oben    #1
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Koblenz
Beiträge: 4.794
Standard last modified header, Sinn und Zweck

Und nochmals, (ich lebe wieder )
ich habe in einer Datei folgenden Code gefunden:
PHP-Code:
header("Last-Modified: " gmdate("D, d M Y H:i:s") ." GMT"); 
Diese Datei wird sozusagen als "auto_prepend_file" genutzt und in jede aufrufende Datei eingebunden.

Hier steht: http://www.faqs.org/rfcs/rfc2616
Zitat:
14.29 Last-Modified

The Last-Modified entity-header field indicates the date and time at
which the origin server believes the variant was last modified.

Last-Modified = "Last-Modified" ":" HTTP-date

An example of its use is

Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

The exact meaning of this header field depends on the implementation
of the origin server and the nature of the original resource. For
files, it may be just the file system last-modified time. For
entities with dynamically included parts, it may be the most recent
of the set of last-modify times for its component parts. For database
gateways, it may be the last-update time stamp of the record. For
virtual objects, it may be the last time the internal state changed.

An origin server MUST NOT send a Last-Modified date which is later
than the server's time of message origination. In such cases, where
the resource's last modification would indicate some time in the
future, the server MUST replace that date with the message
origination date.

An origin server SHOULD obtain the Last-Modified value of the entity
as close as possible to the time that it generates the Date value of
its response. This allows a recipient to make an accurate assessment
of the entity's modification time, especially if the entity changes
near the time that the response is generated.

HTTP/1.1 servers SHOULD send Last-Modified whenever feasible.
Der vorletzte Absatz ist mir nicht klar.
Zitat:
This allows a recipient to make an accurate assessment
of the entity's modification time, especially if the entity changes
near the time that the response is generated.
Jau, und?

Warum genau soll dieser header gesendet werden?
Danke für die Erklärung.

Grüße, Ben.
__________________
Mehr TuS Koblenz geht nicht ... - TuS Koblenz Forum ... Benjamin Klaile ist noch in der Aufwärmphase
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 12:47 Nach oben    #2
Lutz Mahlstedt
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 827
Standard

Die Verwendung ist sehr sinnvoll und auch einigermaßen einfach: Man nehme an, du hast ein Script, das Bilder generiert für eine Gallery oder sonstiges (Wasserzeichen, was auch immer). Dann hast du z.B. das Datum der letzten Änderung der Datei, die aus der Datei selber ersichtlich ist. Wenn du diese als LAST-MODIFIED mitschickst, bekommst du bei der nächsten Anfrage dieses Datum mit dem Request an den Server geschickt, kannst es auslesen und mit dem Datum der ursprünglichen Datei vergleichen. Stimmt es überein, reicht es in dem Falle einen HTTP-Status-Code 304 Not Modified zu schicken und danch die Berechnung der Seite abzubrechen. Es wird dann die Grafik aus dem Cache des Browsers genommen. Diese Art des Cachings kann man auch auf andere Bereiche übertragen (Letzte Änderung im Forum, Gästebuch, etc.). Es spart eine Menge Traffic, wenn sich der Inhalt einer Seite seltener ändern sollte.

Ob es immer in der Praxis so gut funktioniert, wie es die Theorie vorgibt, kann ich nicht sagen, ich weiß nur, dass es bei mir bisher immer sehr gut funktioniert hat.
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 15:49 Nach oben    #3
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Koblenz
Beiträge: 4.794
Standard

Ah, gute Erklärung. Danke.

Habe diese Codezeile tatsächlich in einer sehr, sehr, sehr, sehr häufig aufgerufenen Datei gefunden. Das erklärt dann Vieles.

Hat jemand eventuell eine Art "Tutorial" oder so zur effektiven und optimierten Verwendung solcher Header? Interessantes Thema.

Danke im Voraus. Grüße, Ben.
__________________
Mehr TuS Koblenz geht nicht ... - TuS Koblenz Forum ... Benjamin Klaile ist noch in der Aufwärmphase
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 16:23 Nach oben    #4
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

Ich verwende es in einigen PHP Websites damit eben nicht immer alles neu gesendet werden muss.
Du findest das Last-Modified Datum im IF-MODIFIED-SINCE Header, weshalb du das einfach überprüfen kannst

Nützlich sind auch noch ETag, Expires, Content-Encoding etc.

Btw: Es reicht auch

PHP-Code:
header ("Last-Modified: " date (DATE_RFC822)); 
MfG Byrel

Geändert von Byrel (15.12.2006 um 16:26 Uhr)
Byrel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 18:26 Nach oben    #5
Lutz Mahlstedt
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 827
Standard

Ganz grob sollte vielleicht folgender Beispielcode helfen!?

PHP-Code:
<?php

$arrayMonth 
= array ('Jan' => 1,
                     
'Feb' => 2,
                     
'Mar' => 3,
                     
'Apr' => 4,
                     
'May' => 5,
                     
'Jun' => 6,
                     
'Jul' => 7,
                     
'Aug' => 8,
                     
'Sep' => 9,
                     
'Oct' => 10,
                     
'Nov' => 11,
                     
'Dec' => 12
                     
);

$arrayResponseHeader apache_request_headers ();

$integerFileTime filecdate ('pfad/zur/dat.ei');

if (
array_key_exists ('If-Modified-Since'$arrayResponseHeader) === TRUE)
{
  
$arrayTime preg_split ('°[\s,\:]{1,}°i'$arrayResponseHeader['If-Modified-Since']);
  
  
$integerDay $arrayTime[1];
  
$integerMonth $arrayMonth[$arrayTime[2]];
  
$integerYear $arrayTime[3];
  
$integerHour $arrayTime[4];
  
$integerMinute $arrayTime[5];
  
$integerSecond $arrayTime[6];
  
  
$integerTime mktime ($integerHour$integerMinute$integerSecond$integerMonth$integerDay$integerYear);
  
  if (
$integerFileTime == $integerTime)
  {
    
header ('HTTP/1.1 304 Not Modified');
    exit;
  }
}

header ('Last-Modified: '.gmdate ('D, d M Y H:i:s'$integerFileTime));

// Bild bearbeiten und ausgeben...

?>
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 18:32 Nach oben    #6
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Koblenz
Beiträge: 4.794
Standard

Hallo,
interessant. Danke.

Du meinst aber wohl eher filectime, oder? filecdate gibbet nämlich nicht.

Also, es geht dabei nicht unbedingt um Bilder, sondern um ganz normalen Content. Ist das darauf auch anzuwenden?
Sorry, wenn ich mich etwas dumm anstelle .

Grüße, Ben.
__________________
Mehr TuS Koblenz geht nicht ... - TuS Koblenz Forum ... Benjamin Klaile ist noch in der Aufwärmphase
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 18:48 Nach oben    #7
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.379
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
Hallo,
interessant. Danke.

Du meinst aber wohl eher filectime, oder? filecdate gibbet nämlich nicht.

Also, es geht dabei nicht unbedingt um Bilder, sondern um ganz normalen Content. Ist das darauf auch anzuwenden?
Sorry, wenn ich mich etwas dumm anstelle .

Grüße, Ben.
auch wenn der html-kram oftmals kleiner ist als die ganzen bilder, klar ist es auch hier sinnvoll, spart dir ja traffic
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 18:55 Nach oben    #8
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Koblenz
Beiträge: 4.794
Standard

Nun, es ist ja so. Direkt wird man das kaum anwenden können, denke ich mal, weil der Inhalt ja nicht fix auf einer .html-Seite oder so steht, sondern aus einer Datenbank und via Templateengine ausgegeben wird.

Das heißt, dass ich ja nicht wirklich eine Datei habe, deren letzte Aktualisierung ich testen kann.
Ich wollte eher erfragen, ob es so etwas "in der Art" auch für normalen Content gibt.

Klar, was ich meine?
__________________
Mehr TuS Koblenz geht nicht ... - TuS Koblenz Forum ... Benjamin Klaile ist noch in der Aufwärmphase
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 19:32 Nach oben    #9
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.379
Standard

du musst nur in der Datenbank speichern wann die jeweilige Seite das letzte mal geändert wurde und den wert nutzen anstatt der abfrage wann die datei das lette mal verändert wurde.

Zitat:
Ich wollte eher erfragen, ob es so etwas "in der Art" auch für normalen Content gibt.

Klar, was ich meine?
nicht so ganz
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 20:55 Nach oben    #10
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Koblenz
Beiträge: 4.794
Standard

Zitat:
Zitat von robo47 Beitrag anzeigen
du musst nur in der Datenbank speichern wann die jeweilige Seite das letzte mal geändert wurde und den wert nutzen anstatt der abfrage wann die datei das lette mal verändert wurde.
Jau, aber das ist dann ja wieder irgendwie .. hmm, das sind ja dann im Ernstfall zwei Abfragen anstatt einer. Allerdings sollte das in Seitenbereichen, die nicht so häufig aktualisiert werden dann trotzdem positiv ausfallen, also eine Erleichterung bringen, ne?

Frage ist nur, wo jetzt der Unterschied zu einem "normalen" Cache, sei es selbst implementiert, aus einem Framework oder oder oder .. ist.

Grüße, Ben.
__________________
Mehr TuS Koblenz geht nicht ... - TuS Koblenz Forum ... Benjamin Klaile ist noch in der Aufwärmphase
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 22:12 Nach oben    #11
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.379
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
hmm, das sind ja dann im Ernstfall zwei Abfragen anstatt einer. Allerdings sollte das in Seitenbereichen, die nicht so häufig aktualisiert werden dann trotzdem positiv ausfallen, also eine Erleichterung bringen, ne?
du holst doch irgendwo eh die Daten aus der Datenbank ab, imho kein 2tes Query, sondern viel mehr nur 1 Feld mehr das du abholen musst.

Zitat:
Frage ist nur, wo jetzt der Unterschied zu einem "normalen" Cache, sei es selbst implementiert, aus einem Framework oder oder oder .. ist.

Grüße, Ben.
Der Unterschied liegt darin, dass es erstmal kein Cache ist, sondern noch vor dem Cache sitzt und einen Client der eine saubere Anfrage sendet sagt, dass die Daten noch die gleichen wie bei der letzten Anfrage sind und somit nichtmal den Cache des Systems bemühen muss, sondern der Browser den Browsercache bemüht, somit spart es 2 Sachen, CPU-Last + Traffic, während der Cache erstmal nur CPU-Last spart.

mfg
robo47
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 22:19 Nach oben    #12
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Koblenz
Beiträge: 4.794
Standard

Zitat:
Zitat von robo47 Beitrag anzeigen
Der Unterschied liegt darin, dass es erstmal kein Cache ist, sondern noch vor dem Cache sitzt und einen Client der eine saubere Anfrage sendet sagt, dass die Daten noch die gleichen wie bei der letzten Anfrage sind und somit nichtmal den Cache des Systems bemühen muss, sondern der Browser den Browsercache bemüht, somit spart es 2 Sachen, CPU-Last + Traffic, während der Cache erstmal nur CPU-Last spart.
Okay. Klingt verständlich. Muss ich nochmal drüber nachdenken, aber das wird.


Zitat:
Zitat von robo47 Beitrag anzeigen
du holst doch irgendwo eh die Daten aus der Datenbank ab, imho kein 2tes Query, sondern viel mehr nur 1 Feld mehr das du abholen musst.
Das wiederum verstehe ich nicht. ... ich komm mir so vor, als ob ich es eigentlich verstehen müsste, aber ich tus nicht. *g*

Ganz abgesehen davon, dass ich die Daten eh irgendwo herbekommen muss .. warum sollte ich abfragen, ob die Daten aktualisiert wurden, wenn ich eh die Daten so auslese, als ob sie aktualsiert worden wären?

Bin verwirrt.
__________________
Mehr TuS Koblenz geht nicht ... - TuS Koblenz Forum ... Benjamin Klaile ist noch in der Aufwärmphase
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.12.2006, 22:46 Nach oben    #13
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.379
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
Zitat:
Zitat von robo47 Beitrag anzeigen
du holst doch irgendwo eh die Daten aus der Datenbank ab, imho kein 2tes Query, sondern viel mehr nur 1 Feld mehr das du abholen musst.
Das wiederum verstehe ich nicht. ... ich komm mir so vor, als ob ich es eigentlich verstehen müsste, aber ich tus nicht. *g*

Ganz abgesehen davon, dass ich die Daten eh irgendwo herbekommen muss .. warum sollte ich abfragen, ob die Daten aktualisiert wurden, wenn ich eh die Daten so auslese, als ob sie aktualsiert worden wären?

Bin verwirrt.
Naja, das ganze lässt sich ja über SQL sicher verbinden mit einer art IF:

Angenommen es kommt eine Anfrage mit dem passenden Header (modified since 1.1.2005) dann machst du ein Query in der form (ist jetzt leider zum Teil Pseudocode, weil ich nicht genau auf Anhieb weis wie man das mit dem IF in SQL umsetzt)

Code:
IF feld_last_modified "älter" als 1.1.2005
SELECT *,'TRUE' AS MODIFIED FROM daten
ELSE
SELECT 'FALSE' AS MODIFIED
Ansonsten ruft man die Daten einfach IMMER ab, hat so also ein großes Query mit den Daten und spart sich dann wenn das last-modified Feld einen passenden Wert hat, das parsen (template+content) und sendet nur den header, dass sich die seite nicht geändert hat.

mfg
robo47
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 08:59 Nach oben    #14
Lutz Mahlstedt
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 827
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
Hallo,
interessant. Danke.

Du meinst aber wohl eher filectime, oder? filecdate gibbet nämlich nicht.

Also, es geht dabei nicht unbedingt um Bilder, sondern um ganz normalen Content. Ist das darauf auch anzuwenden?
Sorry, wenn ich mich etwas dumm anstelle .

Grüße, Ben.
Ja, sorry, hatte das ausm Kopf geschrieben und dann wohl den falschen Funktions-Namen genutzt, natürlich soll es filectime sein nicht filecdate ;)

Du kannst es auch auf andere Dinge anwenden, du musst das "Problem" nur portieren. Anstatt filectime zur Ausfindigmachung der letzten Änderung nimmst du in einem Gästebuch zum Beispiel den aktuellsten Timestamp aus der Datenbank. Funktioniert genauso. Man kann damit Foren, Threads, Postfächer, einfach alles so programmieren, dass man nurnoch ein Minimum an Berechnung braucht. Allerdings nur, wenn sich nicht jede Sekunde in den entsprechenden Bereichen eh etwas ändert, ist ja klar, oder? :)

Auch im Bezug auf AJAX ist es sehr interessant, dass man die Inhalte einzelner Abfragen im JavaScript zwischenspeichern kann und bei einer Rückantwort von 304 eben diese nutzt und anderenfalls bei 200 diese überschreibt. Es ist also multifunktional :)

@robo: Ansich funktioniert es genau so. Da man aber unterscheiden kann, ob ein Modified-Header geschickt wurde oder nicht, macht es weniger Sinn in meinen Augen. Ich würde einfach für den Fall, dass der Client einen If-Modified-Since-Header schickt iene zusätzliche Abfrage machen, die nur das aktuellste Datum aus der DB zieht und dieses dann vergleichen. Dank der Datum-/Zeitfunktionen in MySQL kann ich ja bekanntlich aus einem DATETIME-Feld auch gleich den Timestamp zurückgeben lassen. Sollte sich etwas geändert haben, wird dann zwar eine DB-Abfrage mehr gemacht, als sonst, aber im Umkehrschluss erspare ich mir vielleicht 2, 3 oder noch mehr Abfragen, wenn sich eben NICHTS geändert hat.

Geändert von MrNiceGuy (16.12.2006 um 09:03 Uhr)
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 10:54 Nach oben    #15
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Koblenz
Beiträge: 4.794
Standard

Morgen.
Haltet mich für dumm, aber ich habe noch folgende Verständnisschwierigkeiten:

1. Senden eines "if-modified-since"-headers
Zitat:
Zitat von MrNiceGuy Beitrag anzeigen
Ich würde einfach für den Fall, dass der Client einen If-Modified-Since-Header schickt
Hm, das steht dann auch im _SERVER-Array? Habe bei Google zwar so etwas gefunden, allerdings ist das hier nicht aufgeführt:
http://www.php.net/manual/en/reserve...riables.server


2. Auslesen der Daten, wenn keine Veränderung vorgenommen wurde
Zitat:
Zitat von MrNiceGuy Beitrag anzeigen
Sollte sich etwas geändert haben, wird dann zwar eine DB-Abfrage mehr gemacht, als sonst, aber im Umkehrschluss erspare ich mir vielleicht 2, 3 oder noch mehr Abfragen, wenn sich eben NICHTS geändert hat.
Wo genau lese ich denn dann die Daten aus? Aus meinem Cache oder wie ist das gemeint?

Danke nochmals.
Grüße, Ben.


[PS]
Kann mir eventuell jemand einen Codeschnipsel (von mir aus auch Pseudocode) geben? Vielleicht verstehe ich dann das Ganze etwas besser.
__________________
Mehr TuS Koblenz geht nicht ... - TuS Koblenz Forum ... Benjamin Klaile ist noch in der Aufwärmphase
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 13:22 Nach oben    #16
Lutz Mahlstedt
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 827
Standard

Morgen, Ben:

Zu 1) Es steht nicht im $_SERVER. In meinem Beispiel erstellst dud as Array mit dem entsprechenden Inhalt in folgender Zeile:

PHP-Code:
$arrayResponseHeader apache_request_headers (); 
Zu 2) Also: Mal angenommen du hast ein Gästebuch mit einer einzigen Tabelle für alle Einträge. Darin befindet sich ein DATETIME-Feld oder was auch immer das Datum in irgendeiner Form abspeichert. Wenn du nun das Gästebuch das erste Mal anzeigen lässt, schickst du das aktuellste Datum aus dem gesamten Gästebuch mittels

PHP-Code:
header ('Last-Modified: '.gmdate ('D, d M Y H:i:s'$integerLatestTimeStamp)); 
an den Client. Beim nächsten Aufruf dieses Clients erhälst du dann das gesendete Datum von ihm im entsprechenden Array (siehe "Zu 1)") unter 'If-Modified-Since'. Um einen Vergleich machen zu können muss dieses Datum in einen Timestamp umgerechnet werden, dies geschieht in meinem Code einige Posts weiter oben (man kann auch den zu vergleichenden Timestamp einfach in diese Form bringen, das bleibt einem selber überlassen, aber du weißt ja sicher, dass man Timestamps nicht mit Strings vergleichen kann ;)). Dann vergleichst du das vom Client geschickte zuletzt aktuellste Datum mit dem jetzt aktuellsten Datum. Ist beides gleich, hat sich seit dem letzten Besuch nichts verändert -> Http-Status-Code 304 Not Modified. Hat sich doch was geändert: Berechne die Seite neu und setze den Header "Last-Modified" auf das neue Datum.

Ich hoffe ich konnte es etwas anschaulicher rüber bringen!?

EDIT: Codeschnipsel habe ich dir doch schon gegeben, da ist es nur halt auf Dateien bezogen. Anstatt dem Aufruf von filectime() kannst du da auch jeden sonstwie hergeholten Timestamp nehmen.
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.12.2006, 19:08 Nach oben    #17
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

@MrNiceGuy
Doch. Es steht im $_SERVER Array
Byrel ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 09:55 Nach oben    #18
Lutz Mahlstedt
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 827
Standard

Echt? Hmm... Ich war der Meinung, dass es dort nicht zu finden sei?! Nun gut, ich lasse mich eines Besseren belehren, kein Problem :)

Ich muss auch noch eine Ergänzung machen:

Ich habe nochmal geschaut, wie ich das damals realisiert habe und habe vergessen, dass jedes Mal, wenn ich die Header sende, also auch beim 304, muss ich zeigleich den Header "Expires" auf einen Zeitpunkt in der Zukunft setzen (z.B. time () + (60 * 60 * 24 * 365)) und die Header "Cache-Control", sowie "Pragma" leeren.

Ich habe hier mal eine optimierte Version des Code:

PHP-Code:
<?php 
$booleanExitOnNotModified 
FALSE;

$arrayResponseHeader apache_request_headers (); 

/* filemdate() bringt im Vergleich zu filecdate() die letzte Modifikation, welches nun genau besser ist muss jeder selber entscheiden */
$integerFileTime filemdate ('pfad/zur/dat.ei'); 

if (
array_key_exists ('If-Modified-Since'$arrayResponseHeader) === TRUE

  
/* Die Berechnung des Timestamps brachte das Problem hervor, dass ich genau 2 Stunden Zeitversatz habe, da bei der Berechnung offensichtlich nicht die GMT Zeit berechnet wurde. Auf diese Weise klappt es einfacher */
  
if (gmdate ('D, d M Y H:i:s'$integerFileTime) == $arrayResponseHeader['If-Modified-Since']) 
  { 
    
header ('HTTP/1.1 304 Not Modified'); 
    
$booleanExitOnNotModified TRUE;
  } 


/* Die Header habe ich im Text oben näher erläutert */
header ('Expires: '.gmdate ('D, d M Y H:i:s', (time () + (60 60 24 365))));
header ('Cache-Control:'); 
header ('Pragma:'); 
header ('Last-Modified: '.gmdate ('D, d M Y H:i:s'$integerFileTime)); 

if (
$booleanExitOnNotModified === FALSE)
{
  
/* Bearbeitung des Bildes */
}
?>
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus



Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr.


Powered by vBulletin® Version 3.8.4 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0

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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47