XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Knowledge Base (http://xhtmlforum.de/forumdisplay.php?f=79)
-   -   PHP-session + ETag (Header) (http://xhtmlforum.de/showthread.php?t=35221)

ulle 22.04.2005 11:25

PHP-session + ETag (Header)
 
Zitat:

Zitat von Netspy
Sessions sollte man nur dann einsetzen, wenn es absolut nötig ist. Man verhindert damit nämlich das Caching der Seite und ohne besondere Vorkehrungen hat man durch die Session-ID in der URL auch arge Problem mit Suchmaschinen.

:?:
Auch mit verwendeten Etag?

<edit>
wegen THREAD Trennung;

ETag (ein Erklärung)

netspy 22.04.2005 11:55

Zitat:

Zitat von ulle
Zitat:

Zitat von Netspy
....Man verhindert damit nämlich das Caching der Seite...

:?:
Auch mit verwendeten Etag?

Im Normalfall (zumindest bei PHP) ja. PHP sendet bei einer gestarteten Session selbständig einige Header (Cache-Control: no-store,no-cache,post-check=0,pre-check=0 / Expires: Mon, 26 Jul 1997 05:00:00 GMT) mit, die das Caching verhindern und einen Client sicherlich dazu veranlassen, einen evtl. gesetzten ETag zu ignorieren. Diese Header lassen sich AFAIK auch nicht überschreiben. Dagegen löscht PHP teilweise sogar einen gesetzten ETag.

Mario

ulle 22.04.2005 13:23

Zitat:

Zitat von Netspy
...Diese Header lassen sich AFAIK auch nicht überschreiben...

@session_start() + header
Code:

@session_start();

header('ETag: 737060cd8c284d8af7ad3082f209582d');
header('Expires: Thu, 19 Nov 2200 08:52:00 GMT');
header('Cache-Control: ');
header('Pragma: ');

print_r( getallheaders() )
Code:

Array
(
    [Accept] => */*
    [Accept-Encoding] => gzip, deflate
    [Accept-Language] => de
    [Connection] => Keep-Alive
    [Cookie] => hS=be5f4752fac3a93d4b33333b9d5c92cb
    [Host] => localhost
    [If-None-Match] => 737060cd8c284d8af7ad3082f209582d
    [User-Agent] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)
)

print_r( $_SERVER ) / Auszug !!!
Code:

Array
(
    [HTTP_ACCEPT] => */*
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_ACCEPT_LANGUAGE] => de
    [HTTP_CONNECTION] => Keep-Alive
    [HTTP_COOKIE] => hS=be5f4752fac3a93d4b33333b9d5c92cb
    [HTTP_HOST] => localhost
    [HTTP_IF_NONE_MATCH] => 737060cd8c284d8af7ad3082f209582d
    [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)
)

Document-HEADER
Code:

HTTP/1.1 200 OK
Date: Fri, 22 Apr 2005 10:07:58 GMT
Server: Apache/1.3.27 (Win32) PHP/4.3.9
X-Powered-By: PHP/4.3.9
Set-Cookie: hS=b74e49c22d902e674cc09aca06a81071; path=/
Expires: Thu, 19 Nov 2200 08:52:00 GMT
Cache-Control:
Pragma:
ETag: 737060cd8c284d8af7ad3082f209582d
Connection: close
Content-Type: text/html

Und nü......, ich weiß noch nicht ob es wirklich geht, aber es sieht doch nicht schlecht aus, oder?

ulle 22.04.2005 13:50

So nun noch der komplette Test.

Code:

@session_start();

$Content = 'In diesem String steht das gesamte Ausgabe-Dokument';

$etag = md5($Content);


if ( isset($_SERVER['HTTP_IF_NONE_MATCH']) ) {
       
        if ( $_SERVER['HTTP_IF_NONE_MATCH'] == $etag ) {
               
                header('HTTP/1.0 304 Not Modified');
                exit();
        }
}

header('ETag: '.$etag);
header('Expires: Thu, 01 Nov 2200 00:00:00 GMT');
header('Cache-Control: ');
header('Pragma: ');

echo $content;

Und zum Beweis das Access-LOG
Code:

127.0.0.1 - - [22/Apr/2005:12:43:48 +0200] "GET /__files/test.session.inc.php HTTP/1.1" 304 0
Sieht doch gut aus, ich habe es noch nie in der Praxis im Einsatz gehabt, da ich eben erst auf die Idee gekommen bin. Würde aber die Anwortzeiten und den Traffic erheblich senken.

ulle 22.04.2005 14:16

@Netspy - Da Du wohl von uns beiden der Header-Profi bist - wirst Du mir bestimmt noch sagen können wie die Header-Bestandteile für
Code:

header('Expires: Thu, 01 Nov 2200 00:00:00 GMT');
header('Cache-Control: ');
header('Pragma: ');

am besten überschrieben werden. Ich denke da an die Proxies, davon habe ich nämlich keine Ahnung.

<edit>
Was im IE, siehe oben, schön funktioniert hat, klappt mit dem Firefox nicht, dieser sendet nur bei jedem 2.mal einen $_SERVER['HTTP_IF_NONE_MATCH'] - ich schätze das liegt wohl an den unqualifiziert überschriebenen Header-Angaben ?!

Code:

127.0.0.1 - - [22/Apr/2005:14:49:02 +0200] "GET /__files/test.session.inc.php HTTP/1.1" 200 7858
127.0.0.1 - - [22/Apr/2005:14:49:03 +0200] "GET /__files/test.session.inc.php HTTP/1.1" 304 0
127.0.0.1 - - [22/Apr/2005:14:49:04 +0200] "GET /__files/test.session.inc.php HTTP/1.1" 200 7858
127.0.0.1 - - [22/Apr/2005:14:49:05 +0200] "GET /__files/test.session.inc.php HTTP/1.1" 304 0

Wie gesagt evtl. hat ja jemand eine Lösung wie die Header-Angaben der Sessionfunktion schlauer überschrieben werden.

Außerdem habe ich dieses Thema mal in PHP.de eingestellt.

ulle 23.04.2005 11:49

weitere Analyse:

Überschreiben des von session_start() gesetzten Header muß nicht wie oben gezeigt vollständig passieren. Es genügt folgendes:

Code:

<?php
session_start()
:
:
header('ETag: '.$etag);
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
:
?>

Der Cache-Control: must-revalidate gehört/muß zum ETag, die beiden anderen Werte konnte ich nicht einordnen, da diese der gewollten Funktion nicht schaden bleiben diese erstmal drin.
Die Browser reagieren unterschiedlich, und scheinbar nach ihren Eigenheiten. (ausgehend von unveränderten ETag)

IE6 => immer 304 (URL oder Reload)

Firefox 1.0.3 => 200 / 304 im wechsel (URL oder Reload)

Opera 8 => immer 304 (URL) / immer 200 (Reload)

Womit ich sagen würde, der einzig Browser mit Verstand ist hier der Opera - aber egal.



Kennt jemand diese Werte post-check=0, pre-check=0 für den Cache-Control??

netspy 25.04.2005 12:20

Sorry, komme leider jetzt erst zum Antworten.

Mit dem Überschreiben der Header habe ich mich wohl geirrt. Ich hatte das so in Erinnerung, dass sich PHP gegen ein Überschreiben wehrt aber ist dann wohl nicht so. Vielleicht war das auch nur bei früheren PHP-Versionen so.

Damit FF immer richtig anfragt, kannst du mal versuchen, beim "if ( $_SERVER['HTTP_IF_NONE_MATCH'] == $etag )" zusätzlich zum Status auch noch das E-Tag und Cache-control mitzusenden.

Zitat:

Kennt jemand diese Werte post-check=0, pre-check=0 für den Cache-Control??
Das sind mal wieder "Erweiterungen" vom IE, siehe hier:

http://msdn.microsoft.com/workshop/a...rol_Extensions

Mario

ulle 25.04.2005 17:11

So nach längeren Tests habe ich diese Lösung gefunden !!

PHP-Code:

<?php

/**
* PHP.INI [ session.cache_limiter ]
* spezifiziert die Methode der Cacheverwaltung, 
* die bei Session-Seiten benutzt wird.
* (none/nocache/private/private_no_expire/public). 
* Grundeinstellung nocache. 
* Siehe auch session_cache_limiter().
*/
session_cache_limiter('none');
session_start(); 



$Content 'In diesem String steht das gesamte Ausgabe-Dokument';
 
$etag md5($Content); 



if ( isset(
$_SERVER['HTTP_IF_NONE_MATCH']) ) { 
    
   if ( 
$_SERVER['HTTP_IF_NONE_MATCH'] == $etag ) { 
       
      
header('HTTP/1.0 304 Not Modified'); 
      exit(); 
   } 



/**
* HTTP-Header 1.1 ([url]http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html[/url])
*/
header('Cache-Control: must-revalidate, proxy-revalidate, private');
header('ETag: '.$str_ETag);

echo 
$content
?>

Dies bewirkt folgenden Response-Header:
Zitat:

HTTP/1.1 200 OK
Date: Mon, 25 Apr 2005 13:59:32 GMT
Server: Apache/1.3.27 (Win32) PHP/4.3.9
X-Powered-By: PHP/4.3.9
Set-Cookie: PHPSESSID=038fac43801ea59ac138f7ce19a1dd1f; path=/
Cache-Control: must-revalidate, proxy-revalidate, private
ETag: ec61d4745fedab455159c74a341d6261
Connection: close
Content-Type: text/html

Auch der Firefox sendet nun immer einen Request-Header mit einem [If-None-Match] -Value, sofern der UA/Client eine lokale Kopie im Cache hat, d.h. der Browser validiert gegen den Server, bei PHP natürlich gegen das Script, ob sich der Inhalt des Dokuments verändert hat.
Zitat:

print_r( apache_request_headers() )
Array
(
[Accept] => text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
[Accept-Charset] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
[Accept-Encoding] => gzip,deflate
[Accept-Language] => de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
[Connection] => keep-alive
[Cookie] => PHPSESSID=038fac43801ea59ac138f7ce19a1dd1f
[Host] => localhost
[If-None-Match] => ec61d4745fedab455159c74a341d6261
[Keep-Alive] => 300
[Referer] => http://localhost/__files/test.session.inc.php?e=0&t=p
[User-Agent] => Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.7) Gecko/20050414 Firefox/1.0.3
)
Mitgelieferter [If-None-Match] => ec61d4745fedab455159c74a341d6261 bewirkt dann folgenden Response-Header, ohne weitere Dokumenten-Daten =>> minimaler Traffic. Und das wiederholt sich so lange bis sich der $Content, also das Dokument ändert.
Zitat:

HTTP/1.1 304 Not Modified
Date: Mon, 25 Apr 2005 13:59:33 GMT
Server: Apache/1.3.27 (Win32) PHP/4.3.9
X-Powered-By: PHP/4.3.9
Set-Cookie: PHPSESSID=038fac43801ea59ac138f7ce19a1dd1f; path=/
Connection: close
Content-Type: text/html



_________________

@Netspy,
evtl. kannst Du mir noch sagen ob es Sinn macht einen Content-Length: im Response-Header zu senden.
Da ja sowieso der der ETag aus dem String $content gezogen wird wäre dies ja auch kein Problem, hätte es einen Vorteil.

netspy 25.04.2005 20:54

Zitat:

Zitat von ulle
@Netspy,
evtl. kannst Du mir noch sagen ob es Sinn macht einen Content-Length: im Response-Header zu senden.
Da ja sowieso der der ETag aus dem String $content gezogen wird wäre dies ja auch kein Problem, hätte es einen Vorteil.

Den solltest du schon mitsenden. Ein Vorteil (wenn auch ein kleiner) ist der, dass der Browser im Fortschrittsbalken x von 100% anzeigen kann, was ohne Content-Length nicht geht.

Mario

ulle 26.04.2005 11:24

Zitat:

Zitat von Netspy
Ein Vorteil (wenn auch ein kleiner) ist der, dass der Browser im Fortschrittsbalken x von 100% anzeigen kann, was ohne Content-Length nicht geht.

Okay, daraus ergeben sich für mich noch folgende Fragen:
  • Content-Length + g-zip-Komprimierung => Wie reagiert der UA?
  • Mein Apache sendet sowohl bei Grafiken als auch bei CSS-Dateien einen ETag, wunderbar. Nur wo wird der Response-Header im Apache eingestellt, bzw. kann ich dort auch einen entsprechenden Cache-Control einsetzen, um die Proxies und den UA entsprechend einzustellen.
  • Des weiteren hatte ich mal aufgeschnappt das Google und CO. in Begeisterung verfallen falls ein Dokument mit einem ordentlichen ETag gesendet wird.
    Angeblich wird die Site noch häufiger besucht, ohne diesen leidlichen Search-Bot-Traffic.
    Dies müßte aber vermutlich einen entsprechenden Cache-Control bedingen, da momentan z.B. Google bei jedem Besuch, jeder Projekt-Datei, meine externe CSS-Datei zusätzlich zieht, trotz ETag.


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:44 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023