<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Kommentare zu: HTTP Cache-Control &#8211; ein Buch mit sieben Siegeln</title>
	<atom:link href="http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/feed/" rel="self" type="application/rss+xml" />
	<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/</link>
	<description>Optimierung und Tipps zur Beschleunigung von PHP und MySQL</description>
	<lastBuildDate>Tue, 01 May 2012 16:51:11 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
	<item>
		<title>Von: Ralf</title>
		<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/comment-page-1/#comment-18250</link>
		<dc:creator>Ralf</dc:creator>
		<pubDate>Sat, 04 Apr 2009 17:15:37 +0000</pubDate>
		<guid isPermaLink="false">http://phpperformance.de/?p=480#comment-18250</guid>
		<description>Ab hier wird es wohl richtig kompliziert.
User nicht eingeloggt: Expires in der Gegenwart (Seite wird aus dem Cache geladen)
User eingeloggt und Seite wurde von Ajax ge&#228;ndert: Expires in der Vergangenheit (Seite wird neu vom Server geholt)
User eingeloggt und Dokument wird erneut aufgerufen: Expires in der Gegenwart (Seite wird aus dem Cache geladen)

Tja, da hast du wahrscheinlich ein Problem. Denn so auf den ersten Blick wird eine Version der Seite immer aktuell geladen und nur eine Version kann im Cache gespeichert werden. Richtig kompliziert wird es ja dann, wenn der User sich ausloggt und die Seite nicht verl&#228;sst (sowas soll ja auch vorkommen).</description>
		<content:encoded><![CDATA[<p>Ab hier wird es wohl richtig kompliziert.<br />
User nicht eingeloggt: Expires in der Gegenwart (Seite wird aus dem Cache geladen)<br />
User eingeloggt und Seite wurde von Ajax ge&#228;ndert: Expires in der Vergangenheit (Seite wird neu vom Server geholt)<br />
User eingeloggt und Dokument wird erneut aufgerufen: Expires in der Gegenwart (Seite wird aus dem Cache geladen)</p>
<p>Tja, da hast du wahrscheinlich ein Problem. Denn so auf den ersten Blick wird eine Version der Seite immer aktuell geladen und nur eine Version kann im Cache gespeichert werden. Richtig kompliziert wird es ja dann, wenn der User sich ausloggt und die Seite nicht verl&#228;sst (sowas soll ja auch vorkommen).</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Jan</title>
		<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/comment-page-1/#comment-18247</link>
		<dc:creator>Jan</dc:creator>
		<pubDate>Sat, 04 Apr 2009 15:59:07 +0000</pubDate>
		<guid isPermaLink="false">http://phpperformance.de/?p=480#comment-18247</guid>
		<description>Das Problem ist, dass ich den Expires-Header in der Vergangenheit ja dann senden w&#252;rde, wenn ich feststelle, dass der User eingeloggt ist, richtig?
Dummerweise wird aber dann ja gar kein Request geschickt, da der Browser die Datei einfach aus dem lokalen Cache l&#228;dt, ohne nachzufragen, ob die Datei noch aktuell ist.

Falls ich es immernoch nicht verstanden habe, schicke mal bitte ein Beispiel mit datei.php - wie w&#252;rdest Du die Header setzen, wenn der User nicht eingeloggt ist und wie, wenn er eingeloggt ist? Ich denke, dann wird es klarer.</description>
		<content:encoded><![CDATA[<p>Das Problem ist, dass ich den Expires-Header in der Vergangenheit ja dann senden w&#252;rde, wenn ich feststelle, dass der User eingeloggt ist, richtig?<br />
Dummerweise wird aber dann ja gar kein Request geschickt, da der Browser die Datei einfach aus dem lokalen Cache l&#228;dt, ohne nachzufragen, ob die Datei noch aktuell ist.</p>
<p>Falls ich es immernoch nicht verstanden habe, schicke mal bitte ein Beispiel mit datei.php &#8211; wie w&#252;rdest Du die Header setzen, wenn der User nicht eingeloggt ist und wie, wenn er eingeloggt ist? Ich denke, dann wird es klarer.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Sammie</title>
		<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/comment-page-1/#comment-18245</link>
		<dc:creator>Sammie</dc:creator>
		<pubDate>Sat, 04 Apr 2009 15:24:57 +0000</pubDate>
		<guid isPermaLink="false">http://phpperformance.de/?p=480#comment-18245</guid>
		<description>Selbst dann versteh ich dein Problem nicht.

Ein &quot;Cache-Control: no-cache&quot;-Angabe speichert trotzdem im Cache, setzt aber eine bestehende Online-Verbindung voraus, um die &quot;Document modified&quot;-Abfrage durchzuf&#252;hren. Ist dieser Header gesetzt, kann man im Offline-Modus nicht auf diese Cache-Version zugreifen. Du zwingst damit den User sozusagen online zu sein, und auf neuere Dokumente zu pr&#252;fen, wenn er die Webseite abrufen will und damit kein reines Cache-Using (offline) zu erlauben (nur deswegen hei&#223;t es etwas verwirrenderweise &quot;no-cache&quot;).

Willst du speziell erreichen, dass im eingeloggten Zustand  wirklich eine neue Version geladen wird und damit der Cache umgangen wird, dann setze eine &quot;Expires&quot;-Header in die Vergangenheit und einen zus&#228;tzlichen &quot;Last-Modified&quot;-Header mit dem aktuellen Datum (siehe Bsp oben). Ohne den neuen Last-Modified-Header hat sich aus Sicht deines Browser ja nichts am Dokument ge&#228;ndert, deshalb ruft er auch den Cache auf beim ersten Mal. 

Zu deiner Pragma-Frage, verweise ich dich mal auf Microsoft selbst: http://support.microsoft.com/kb/234067</description>
		<content:encoded><![CDATA[<p>Selbst dann versteh ich dein Problem nicht.</p>
<p>Ein &#034;Cache-Control: no-cache&#034;-Angabe speichert trotzdem im Cache, setzt aber eine bestehende Online-Verbindung voraus, um die &#034;Document modified&#034;-Abfrage durchzuf&#252;hren. Ist dieser Header gesetzt, kann man im Offline-Modus nicht auf diese Cache-Version zugreifen. Du zwingst damit den User sozusagen online zu sein, und auf neuere Dokumente zu pr&#252;fen, wenn er die Webseite abrufen will und damit kein reines Cache-Using (offline) zu erlauben (nur deswegen hei&#223;t es etwas verwirrenderweise &#034;no-cache&#034;).</p>
<p>Willst du speziell erreichen, dass im eingeloggten Zustand  wirklich eine neue Version geladen wird und damit der Cache umgangen wird, dann setze eine &#034;Expires&#034;-Header in die Vergangenheit und einen zus&#228;tzlichen &#034;Last-Modified&#034;-Header mit dem aktuellen Datum (siehe Bsp oben). Ohne den neuen Last-Modified-Header hat sich aus Sicht deines Browser ja nichts am Dokument ge&#228;ndert, deshalb ruft er auch den Cache auf beim ersten Mal. </p>
<p>Zu deiner Pragma-Frage, verweise ich dich mal auf Microsoft selbst: <a href="http://support.microsoft.com/kb/234067" rel="nofollow">http://support.microsoft.com/kb/234067</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Jan</title>
		<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/comment-page-1/#comment-18241</link>
		<dc:creator>Jan</dc:creator>
		<pubDate>Sat, 04 Apr 2009 14:24:25 +0000</pubDate>
		<guid isPermaLink="false">http://phpperformance.de/?p=480#comment-18241</guid>
		<description>Glaube Du hast da etwas misverstanden. Es geht nicht um das Caching des AJAX-Requests sondern um den ganz normalen URL-GET-Request - also das Aufrufen einer beliebigen Seite &#252;ber eine URL. Wenn der User nicht eingeloggt ist und die Seite in der Zwischenzeit nicht akutalisiert wurde (Browsercache-Inhalt ist aktuell), dann soll sie auch aus dem Cache geladen werden statt sie neu zu generieren.</description>
		<content:encoded><![CDATA[<p>Glaube Du hast da etwas misverstanden. Es geht nicht um das Caching des AJAX-Requests sondern um den ganz normalen URL-GET-Request &#8211; also das Aufrufen einer beliebigen Seite &#252;ber eine URL. Wenn der User nicht eingeloggt ist und die Seite in der Zwischenzeit nicht akutalisiert wurde (Browsercache-Inhalt ist aktuell), dann soll sie auch aus dem Cache geladen werden statt sie neu zu generieren.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Sammie</title>
		<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/comment-page-1/#comment-18240</link>
		<dc:creator>Sammie</dc:creator>
		<pubDate>Sat, 04 Apr 2009 14:04:53 +0000</pubDate>
		<guid isPermaLink="false">http://phpperformance.de/?p=480#comment-18240</guid>
		<description>Also aus meiner Sicht sollten AJAX-Requests keinen Cache nutzen und deswegen findest du auch nur solche Beitr&#228;ge in den Foren. Ich mache immer:

header(&#039;Cache-Control: no-cache, must-revalidate, proxy-revalidate&#039;);
header(&#039;Pragma: no-cache&#039;);
header(&#039;Expires: Thu, 15 Aug 1984 13:30:00 GMT&#039;);
header(&#039;Last-Modified: &#039;. gmdate(&#039;D, d M Y H:i:s&#039;) . &#039; GMT&#039;);

durch ein beliebiges Expires-Datum in der Vergangenheit erzwingt man immer eine neue Version, dann wird grunds&#228;tzlich nichts aus dem Cache genutzt.

Nur was DU genau erreichen willst ist mir nicht klar. AJAX ist (in den meisten F&#228;llen zumindest) das Anfordern eines XML-Dokuments, dessen Inhalte dann per Javascript auseinandergepfl&#252;ckt und dynamisch in dem DOM-Tree eingef&#252;gt werden. Das einzige, was hier den Cache ansich beansprucht ist das Laden des XML-Dokuments. Und ob das aktuell ist oder nicht, muss auf der Serverseite analysiert werden - der Cache des Users hat damit nichts zu tun. Du validierst die Session serverseitig und schickst dem User dann entweder ein Loginformular oder einen &quot;Hallo User&quot;-Text. Der Browser selbst wei&#223; doch gar nicht, ob die Session noch valide ist und es w&#228;re auch bl&#246;dsinnig, dem die Entscheidung zu &#252;berlassen.</description>
		<content:encoded><![CDATA[<p>Also aus meiner Sicht sollten AJAX-Requests keinen Cache nutzen und deswegen findest du auch nur solche Beitr&#228;ge in den Foren. Ich mache immer:</p>
<p>header(&#039;Cache-Control: no-cache, must-revalidate, proxy-revalidate&#039;);<br />
header(&#039;Pragma: no-cache&#039;);<br />
header(&#039;Expires: Thu, 15 Aug 1984 13:30:00 GMT&#039;);<br />
header(&#039;Last-Modified: &#039;. gmdate(&#039;D, d M Y H:i:s&#039;) . &#039; GMT&#039;);</p>
<p>durch ein beliebiges Expires-Datum in der Vergangenheit erzwingt man immer eine neue Version, dann wird grunds&#228;tzlich nichts aus dem Cache genutzt.</p>
<p>Nur was DU genau erreichen willst ist mir nicht klar. AJAX ist (in den meisten F&#228;llen zumindest) das Anfordern eines XML-Dokuments, dessen Inhalte dann per Javascript auseinandergepfl&#252;ckt und dynamisch in dem DOM-Tree eingef&#252;gt werden. Das einzige, was hier den Cache ansich beansprucht ist das Laden des XML-Dokuments. Und ob das aktuell ist oder nicht, muss auf der Serverseite analysiert werden &#8211; der Cache des Users hat damit nichts zu tun. Du validierst die Session serverseitig und schickst dem User dann entweder ein Loginformular oder einen &#034;Hallo User&#034;-Text. Der Browser selbst wei&#223; doch gar nicht, ob die Session noch valide ist und es w&#228;re auch bl&#246;dsinnig, dem die Entscheidung zu &#252;berlassen.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: GhostGambler</title>
		<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/comment-page-1/#comment-18098</link>
		<dc:creator>GhostGambler</dc:creator>
		<pubDate>Mon, 30 Mar 2009 12:35:45 +0000</pubDate>
		<guid isPermaLink="false">http://phpperformance.de/?p=480#comment-18098</guid>
		<description>Es gibt im Internet &#252;brigens nette Dokumente, welche einem jegliche Direktiven allumfassend erl&#228;utern, ohne Gerate und Spekulieren von selbst ernannten &quot;Kennern&quot;:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9

Die Frage nach 1.0 vs. 1.1 wird dort &#252;brigens auch (kurz) angeschnitten.</description>
		<content:encoded><![CDATA[<p>Es gibt im Internet &#252;brigens nette Dokumente, welche einem jegliche Direktiven allumfassend erl&#228;utern, ohne Gerate und Spekulieren von selbst ernannten &#034;Kennern&#034;:<br />
<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9" rel="nofollow">http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9</a></p>
<p>Die Frage nach 1.0 vs. 1.1 wird dort &#252;brigens auch (kurz) angeschnitten.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Jan</title>
		<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/comment-page-1/#comment-18096</link>
		<dc:creator>Jan</dc:creator>
		<pubDate>Mon, 30 Mar 2009 12:06:28 +0000</pubDate>
		<guid isPermaLink="false">http://phpperformance.de/?p=480#comment-18096</guid>
		<description>Kurze Frage: Ist Pragma:no-cache das gleiche wie Cache-Control:no-cache - nur eben ersteres in HTTP 1.0 und letzteres 1.1?
Dann w&#228;re es ja kein Problem das noch hinzuzuf&#252;gen.</description>
		<content:encoded><![CDATA[<p>Kurze Frage: Ist Pragma:no-cache das gleiche wie Cache-Control:no-cache &#8211; nur eben ersteres in HTTP 1.0 und letzteres 1.1?<br />
Dann w&#228;re es ja kein Problem das noch hinzuzuf&#252;gen.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Ralf</title>
		<link>http://phpperformance.de/http-cache-control-ein-buch-mit-sieben-siegeln/comment-page-1/#comment-18095</link>
		<dc:creator>Ralf</dc:creator>
		<pubDate>Mon, 30 Mar 2009 11:44:02 +0000</pubDate>
		<guid isPermaLink="false">http://phpperformance.de/?p=480#comment-18095</guid>
		<description>Im Prinzip ist das Verhalten logisch. Durch den Ajax-Request wird n&#228;mlich nicht das Dokument im Browser ver&#228;ndert, sondern JS ver&#228;ndert das DOM. F&#252;r den Browser hat sich am Dokument erst einmal nichts ver&#228;ndert.
Ab hier liegt es am Programmierer des Browsers wie mit den Dokumenten umgegangen wird. Denn oft ist es reine Vermutung ob eine Seite aus dem Cache geholt werden kann oder ob sie neu geladen werden muss. Manche Browser sind hier etwas &#252;bereifrig und greifen aus Performance-Gr&#252;nden lieber auf den Cache zur&#252;ck als die Seite neu zu laden. Ein &quot;schneller&quot; Browser ist ja schlie&#223;lich auch ein gutes Marketing-Kriterium.

Zur Not kann man sich auch mit einer anderen Datei aushelfen. Ist der User nicht eingeloggt, wird die index.php gesendet. Ist der User eingeloggt, wird z.B. index2.php gesendet. Dann kann man sich relativ sicher sein das die Seite neu geladen wird und im Browser-Cache zwei unterschiedliche Dokumente liegen (User eingeloggt / User nicht eingeloggt).

Die Cache-Steuerung stammt halt aus einer Zeit als JavaScript und kurzfristige &#196;nderungen am Dokument (Ajax) noch nicht existierten. Hier treffen halt immer noch zwei Welten aufeinander.
Die Cache-Steuerung wurde urspr&#252;nglich nicht f&#252;r Browser entwickelt, sondern f&#252;r Proxy-Server. Deswegen kann es passieren das du mit deiner L&#246;sung beim User trotzdem nicht das erreichst was du erreichen m&#246;chtest. Denn Sobald ein Proxy mit &#228;lterer Software dazwischen geschaltet ist (z.B. veraltetes Firmennetzwerk), wird es nicht mehr funktionieren. Einfach mal in die Apache-Manuals schauen:
&quot;Note that HTTP/1.0 caches might not implement Cache-Control and might only implement Pragma: no-cache&quot; (&lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9&quot; rel=&quot;nofollow&quot;&gt;Apache-Manual&lt;/a&gt;)
Ich deute das so, dass sich die Cache-Steuerung immer an das &quot;schw&#228;chste Glied&quot; in der Kette h&#228;lt. Ist also ein HTTP/1.0-Cache irgendwo aktiv, wird deine Cache-Steuerung ignoriert.</description>
		<content:encoded><![CDATA[<p>Im Prinzip ist das Verhalten logisch. Durch den Ajax-Request wird n&#228;mlich nicht das Dokument im Browser ver&#228;ndert, sondern JS ver&#228;ndert das DOM. F&#252;r den Browser hat sich am Dokument erst einmal nichts ver&#228;ndert.<br />
Ab hier liegt es am Programmierer des Browsers wie mit den Dokumenten umgegangen wird. Denn oft ist es reine Vermutung ob eine Seite aus dem Cache geholt werden kann oder ob sie neu geladen werden muss. Manche Browser sind hier etwas &#252;bereifrig und greifen aus Performance-Gr&#252;nden lieber auf den Cache zur&#252;ck als die Seite neu zu laden. Ein &#034;schneller&#034; Browser ist ja schlie&#223;lich auch ein gutes Marketing-Kriterium.</p>
<p>Zur Not kann man sich auch mit einer anderen Datei aushelfen. Ist der User nicht eingeloggt, wird die index.php gesendet. Ist der User eingeloggt, wird z.B. index2.php gesendet. Dann kann man sich relativ sicher sein das die Seite neu geladen wird und im Browser-Cache zwei unterschiedliche Dokumente liegen (User eingeloggt / User nicht eingeloggt).</p>
<p>Die Cache-Steuerung stammt halt aus einer Zeit als JavaScript und kurzfristige &#196;nderungen am Dokument (Ajax) noch nicht existierten. Hier treffen halt immer noch zwei Welten aufeinander.<br />
Die Cache-Steuerung wurde urspr&#252;nglich nicht f&#252;r Browser entwickelt, sondern f&#252;r Proxy-Server. Deswegen kann es passieren das du mit deiner L&#246;sung beim User trotzdem nicht das erreichst was du erreichen m&#246;chtest. Denn Sobald ein Proxy mit &#228;lterer Software dazwischen geschaltet ist (z.B. veraltetes Firmennetzwerk), wird es nicht mehr funktionieren. Einfach mal in die Apache-Manuals schauen:<br />
&#034;Note that HTTP/1.0 caches might not implement Cache-Control and might only implement Pragma: no-cache&#034; (<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9" rel="nofollow">Apache-Manual</a>)<br />
Ich deute das so, dass sich die Cache-Steuerung immer an das &#034;schw&#228;chste Glied&#034; in der Kette h&#228;lt. Ist also ein HTTP/1.0-Cache irgendwo aktiv, wird deine Cache-Steuerung ignoriert.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

