Zum Inhalt springen

cHash, realURL und MCV

Erstellt am 25. Juli 2009 · 1 Antwort · letzte Antwort am 2. August 2009

Tags: RealURL, Cache & Performance, Frage

sunfish ·

Hallo,

cHash in Verbindung mit realURL und lib (MVC-Extensions) ist kein ganz einfaches Thema.

Bei einer Extension, die z.B. die ohne Parameterübergabe eine News-Übersicht anzeigt und mit Parametern entweder eine andere Übersichtsseite oder eine einzelne News anzeigt, ist es sinnvoll, die jeweiligen Seiten zu cachen.

Damit aber der Cache nicht überläuft, weil eine Seite von aussen mit den unterschiedlichsten Parametern "beschossen" wird, werden parametrisierte Seiten nur dann gecached, wenn die Parameter in Links erscheinen, die via typolink in der typo3 Installation erzeugt wurden.

Dafür ist cHash da. Damit eine Seite mit einem Set von $_GET-Variablen im Cache wiedergefunden werden kann, wird die die komplette URL in einen md5-hash + individuelles salt gepackt. 1)

Bei realURL ist dieser cHash Eintrag nicht sichtbar. 2)

In tx_realurl_chashcache wird ein Eintrag gemacht, wenn der Link in typo3 als typolink (mit aktiviertem cHash) erzeugt wird (encodeSpURL_doEncode -> encodeSpURL_cHashCache). 3)

Bei einer MVC-Extension, die unter der Verwendung der extension lib geschrieben wird, werden Links, die über tx_lib_link erzeugt werden, mit einem cHash versehen. (var $noCacheBoolean = false😉

Wird eine Seite mit Parametern aufgerufen, wird sie von realURL zerlegt (decodeSpURL_doDecode) und der cHash ermittelt. Ist kein passender Eintrag in der Tabelle tx_realurl_chashcache vorhanden, dann wird der Inhalt der Seite neu erzeugt, aber nicht in den Cache geschrieben. 4)

Sollen also Seiten mit Parametern in den cache geschrieben werden, ist der Aufruf einer Seite notwendig, auf der diese Seiten verlinkt sind.

Soweit meine Beschreibung. Berichtigungen oder Ergänzungen sind sehr erwünscht.

sunfish

----------------------------------------------------------------------
1) aus the myteries of chash:
"An easy solution to caching would be to simply identify a page by its URL. So when someone asks for “?id=123” and “?id=123&type=1” we will just md5-hash the URL and use that to look up the page next time."

aus class.tx_realurl.php comments

2) "The problem is: a cHash string is not "speaking" (and never will be!)"

3) "So; the only option we are left with if we want to remove the "?cHash=...:" remains in URLs and at the same time do not want to include it in the virtual path is; store it in the database!"

4) decodeSpURL_cHashCache:
Return no value (eg. if table has been cleared) even if there should be one! In this scenario it will look to the outside as if all parameters except cHash has been set.

Quellen zum Thema:
http://typo3.org/development/articles/the-mysteries-of-chash/
http://www.sk-typo3.de/Richtiges-Cachen-mit-pi_base.188.0.html
http://dmitry-dulepov.com/article/linking-properly-in-your-typo3-code.html
http://dmitry-dulepov.com/article/when-do-you-need-chash-in-typo3.html

sunfish ·

Seiten ohne cHash, Plugin-Typ: USER oder USER_INT

Bei der beschriebenen News-Extension, tritt das Problem auf, dass nach Löschen des page_cache ab und an statt den ersten 10 Meldungen unerwartet irgendeine alte Einzelnachricht auf der Startseite erscheint.

Wird eine Einzelnachricht oder frühere News-Seite mit den entsprechenden Parametern aufgerufen, ermittelt realURL den cHash der jeweiligen Seite und prüft ob dieser in der Tabelle tx_realurl_chashcache enthalten ist. Ist dies der Fall, schreibt realURL in der function decodeSpURL den cHash als $_GET['cHash']. Wurde der cHash noch nicht über einen typolink in tx_realurl_chashcache eingetragen, wird die Seite ohne cHash aufgerufen und - ist der page_cache für die Startseite (ohne Parameter) leer - dort eingetragen.

Abhilfe kann eine Condition schaffen, mit der das Plugin wahlweise als Typ: USER oder USER_INT aufgerufen wird. 1)
Beim Plugin-Typ USER_INT wird die Seite nicht in den page_cache geschrieben. Davon soll die Startseite ausgenommen werden, weil sie zwar keine Parameter enthält, aber deshalb von realURL auch keinen cHash "bekommt". Da die News-Startseite aber sicherlich die am häufigsten aufgerufene Seite der News-Extension ist, soll sie in jedem Fall gecached werden.

BEISPIEL:
(A)) Schreibe ins Setup:

#  Cache the plugin with parameters (cHash exist)
#  or without parameters as startpage (no cHash and no tx_dbdata parameters)
plugin.tx_dbdata.feed = USER

#  GP:cHash = IMPORTANT: do not cache if there is cHash missing !!!!
#  realURL is creating the GP:cHash, userFunc is needed until typo3 4.3
#  typo3 4.3 [globalVar = GP:tx_dbdata != FALSE]
[globalVar = GP:cHash = ] && [userFunc = user_dbdataPrametersExist()]
plugin.tx_dbdata.feed.includeLibs = EXT:dbdata/controllers/class.tx_dbdata_controllers_feed.php
plugin.tx_dbdata.feed = USER_INT
[end]

(B) Schreibe für den zweiten Teil der Condition in die ext_localconf.php der Extension (tx_dbdata)

function user_dbdataPrametersExist(){
  if(isset($_GET['tx_dbdata'])) {       
    return true;
  } else{   
    return false;       
  }
}

Ab typo3-Version 4.3 gibt es bei den Conditions die Möglichkeit [globalVar = GP:tx_dbdata != FALSE], dann ist die userFunc nicht mehr notwendig.

Vielleicht hilft das ja jemanden weiter.

sunfish

1) Die Lösung, die für "normale" und MVC-Extensions gleichmermaßen verwendet werden kann, stammt vom realURL Meister Dmitry Dulepov
http://dmitry-dulepov.com/article/missing-chash-make-plugin-user-int.html