zurück zur Startseite
  


Zurück XHTMLforum > (X)HTML und CSS > Knowledge Base
Seite neu laden PHP-session + ETag (Header)

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 22.04.2005, 10:25
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 02.06.2003
Beiträge: 2.441
ulle befindet sich auf einem aufstrebenden Ast
Standard 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)
__________________
</ulle>
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 22.04.2005, 10:55
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.956
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 22.04.2005, 12:23
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 02.06.2003
Beiträge: 2.441
ulle befindet sich auf einem aufstrebenden Ast
Standard

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>
Mit Zitat antworten
  #4 (permalink)  
Alt 22.04.2005, 12:50
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 02.06.2003
Beiträge: 2.441
ulle befindet sich auf einem aufstrebenden Ast
Standard

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>
Mit Zitat antworten
  #5 (permalink)  
Alt 22.04.2005, 13:16
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 02.06.2003
Beiträge: 2.441
ulle befindet sich auf einem aufstrebenden Ast
Standard

@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>
Mit Zitat antworten
  #6 (permalink)  
Alt 23.04.2005, 10:49
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 02.06.2003
Beiträge: 2.441
ulle befindet sich auf einem aufstrebenden Ast
Standard

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??
__________________
</ulle>
Mit Zitat antworten
  #7 (permalink)  
Alt 25.04.2005, 11:20
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.956
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
  #8 (permalink)  
Alt 25.04.2005, 16:11
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 02.06.2003
Beiträge: 2.441
ulle befindet sich auf einem aufstrebenden Ast
Standard

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.
__________________
</ulle>
Mit Zitat antworten
  #9 (permalink)  
Alt 25.04.2005, 19:54
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.956
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 26.04.2005, 10:24
Erfahrener Benutzer
XHTMLforum-Kenner
Thread-Ersteller
 
Registriert seit: 02.06.2003
Beiträge: 2.441
ulle befindet sich auf einem aufstrebenden Ast
Standard

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.
__________________
</ulle>
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Apache, IIS, PHP und Session Cookie laborix Serveradministration und serverseitige Scripte 10 18.12.2011 01:42
PHP MySQL - Anfängerfrage: Empfehlung GET, POST, SESSION oder Kombination? DerJeff Serveradministration und serverseitige Scripte 9 07.06.2011 11:01
header verrutscht... weblearner CSS 6 03.12.2008 19:34
Dateien auslagern - Include und PHP ArcVieh Serveradministration und serverseitige Scripte 17 27.03.2008 18:09
PHP Header Problem dan_23 Serveradministration und serverseitige Scripte 17 05.03.2008 14:48


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