Closed dmolineus closed 9 years ago
Das ist ein grundsätzliches Problem bei einer nicht unterstützten und damit gecachten Sprache (Accept-Language
). Diese werden immer ungecacht ausgeliefert anstatt die gecachte Fallbackseite zu laden.
@dmolineus PR? ;)
Wenn wir uns im Voraus auf eine Lösung verständigen können, mach ich das. Mein Vorschlag ist folgender:
empty.LANG
als auch nur empty
angelegt werden (FrontendTemplate)empty.LANG
versucht empty
zu laden.Dadurch erspart man sich eine Datenbankabfrage beim Laden vom Cache, um die Standardsprache zu ermitteln. Die doppelten Cache-Einträge sind imho zu verschmerzen.
Woher soll das System denn wissen dass für empty.LANG
keine Seite existiert, oder ob die einfach noch nicht gecacht wurde?
Woher soll das System denn wissen dass für empty.LANG keine Seite existiert, oder ob die einfach noch nicht gecacht wurde?
Danke für den Einwand, hatte ich nicht bedacht.
Ich seh erstmal keine Möglichkeit ohne Datenbankabfrage dies festzustellen (es sei denn man hat eine Cache-Datei mit allen verfügbaren Sprachen).
@leofeyer up for discussion-Label?
Eine Datenbank-Abfrage kommt jedoch beim Laden aus dem Cache keinesfalls in Frage.
(es sei denn man hat eine Cache-Datei mit allen verfügbaren Sprachen).
bzw. der Rootseiten Sprach Definition inkl. Fallbacksprache. Dann käme man zumindest für den Fall hier https://github.com/contao/core/issues/7650 schon weiter.
Wir haben heute auf Mumble darüber gesprochen, verstehen aber das Problem nicht so ganz. Könntest Du uns das nochmal erklären bzw. beim nächsten Mumble-Termin mit uns besprechen?
Es ist das gleiche Problem, wie @amenk in #7650 detaillierter beschrieben hat und hier ja auch verlinkt ist. Doch gern noch einmal konkreter.
de
).de-DE,de
.outputFromCache
wird nun empty.de-DE
versucht aus dem Cache zu laden, was nicht existiert.Dies tritt auch auf, wenn Accept-Language Header en
ist und dafür keine gecachte Datei existiert.
Die Probleme dabei sind:
de-DE
und de
statt, auch nicht in die andere Richtung.Der ursprünglich vermutete Zusammenhang mit dem Update auf Contao 3.4 konnte nicht bestätigt werden. Der Fehler wurde jedoch erst durch den massiven Performance-Verlust nach dem Update sichtbar (Ladezeit ~0.9sec gegebüber ~0.35sec davor).
Gern erläutere ich es auch bei einem nächsten Mumble-Termin, bin aber zu den 19 Uhr Terminen donnerstags nicht verfügbar.
Meiner Meinung nach vertust Du Dich in Punkt 2:
Diese wird mit den Spracheinstellung gecacht (
de
).
Wenn die Primärsprache aus dem Accept-Language-Header de-DE
ist, wird die Seite unter empty.de-DE
im Cache abgelegt.
Ich habe mir den Code nicht angesehen, aber ich bin der Überzeugung die Seite wird unter empty.de
(nämlich der Sprache der Root-Seite) gecacht.
Wenn die Primärsprache aus dem Accept-Language-Header de-DE ist, wird die Seite unter empty.de-DE im Cache abgelegt.
Nein, wird sie nicht. https://github.com/contao/core/blob/master/system/modules/core/classes/FrontendTemplate.php#L204
Wäre auch fahrlässig, da man durch einen gefakten Header den Cache zuspammen könnte.
Da habt ihr beide Recht.
Ich denke man sollte wie in https://github.com/contao/core/issues/7618#issuecomment-75456963 beschrieben die Root Seiten und Fallback Struktur separat cachen.
Das nützt nichts, weil wir ja nicht wissen ob es eine Sprache de-DE
gibt und sie einfach noch nicht gecacht wurde…
Ich dachte jetzt an ein Array, Serialisiert in einer Datei abgelegt in der die Root Seiten und deren Sprachen gecacht werden. So braucht man keine Datenbankabfrage. Ein andere Möglichkeit wird es denke ich nicht geben, denn man braucht ja die Infos über die Fallback Struktur. Statt dem Array könnte man auch leere Dateien mit den anderen Sprachen anlegen um sie als "Existent aber nicht gecacht" zu markieren und dann bei Bedarf cachen.
Ich dachte jetzt an ein Array, Serialisiert in einer Datei abgelegt in der die Root Seiten und deren Sprachen gecacht werden. So braucht man keine Datenbankabfrage. Ein andere Möglichkeit wird es denke ich nicht geben, denn man braucht ja die Infos über die Fallback Struktur.
Genau das war auch meine Idee, die ich oben vorgeschlagen hatte.
Und generell braucht man wohl noch irgendwo ein Stück Code was von de-DE auf de mappt, oder?
Ein Mapping zwischen de <-> de-DE gäre gut, auch wenn nicht ganz trivial. Angenommen man hat eine Seite mit de-AT und eine mit de-DE stellt sich die Frage auf was de dann gemappt wird.
Behoben in ed1a73a487e4a1c65043734df9c214fe3bd1c75b. Beim Aufbau des internen Cache wird jetzt eine Mapper-Datei angelegt, die bestehende Sprachen plus Fallback-Sprache auf die jeweiligen Cache-Keys mappt. Nur wenn der interne Cache gar nicht aufgebaut ist, fällt der Frontend-Controller auf die bisherige Lösung mit der ersten akzeptierten Sprache zurück.
@all Bitte testen und Feedback geben. @contao/developers Sollen wir das in die 3.2 portieren?
@contao/developers Sollen wir das in die 3.2 portieren?
Ich stimme für Nein. Begründung:
@Toflar So einfach ist das nicht.
hotfix/3.4.5
-Zweig enthalten, also auch nicht in einem Feature-Release. Entweder müssten wir also beide Hotfix-Releases oder keinen damit ausliefern, oder?@Toflar
Das aktuelle Verhalten ist zwar nicht korrekt, beeinflusst aber die Funktionalität nicht wesentlich.
Auf einer Seite, die nur einen Seitenbaum hat und als Sprache de
festgelegt hat + Sprachenfallback, bekommt ein User nie eine Seite aus dem Cache von Contao, wenn er mit einem HTTP Accept-Language header ungleich de
daher kommt.
Wenn eine Contao Seite von der Cache Funktionalität abhängig ist (warum auch immer) besteht imho eine starke Beeinträchtigung.
Es geht ja nicht um die Frage ob's ein Bug ist oder nicht. Selbstverständlich ist es einer und wenn es ein Bug ist dann beeinflusst der selbstverständlich auch die Funktionalität. Ist doch logisch. Ich hab nur gesagt er beeinträchtigt die Funktionalität von Contao nicht wesentlich weil es keinen Grund gibt, warum der Cache auf die Funktionsweise einen Einfluss haben sollte. Er reduziert nur Server- und/oder Bandwidth-Load.
Ja ok, verstehe.
Würde auch verstehen, wenn dieser Fix letztendlich auch erst in der nächsten LTS version auftaucht (wie von leofeyer erwähnt).
Auf einer Seite, die nur einen Seitenbaum hat und als Sprache de festgelegt hat + Sprachenfallback, bekommt ein User nie eine Seite aus dem Cache von Contao, wenn er mit einem HTTP Accept-Language header ungleich de daher kommt.
Nicht ganz, das trifft natürlich nur auf die Startseite zu (ev. nur falls diese ein Alias index
hat?).
Fände auch dass das in die 3.5 sollte. Es ist nicht wirklich ein Bug, sondern ein known limitation (siehe #7650)
Nicht ganz, das trifft natürlich nur auf die Startseite zu (ev. nur falls diese ein Alias index hat?).
Ah ok, da hab ich wohl zu wenig getestet :)
Ich hab nur gesagt er beeinträchtigt die Funktionalität von Contao nicht wesentlich weil es keinen Grund gibt, warum der Cache auf die Funktionsweise einen Einfluss haben sollte
Auf die Funktionsweise nicht, auf die wahrgenommene Performance jedoch schon. Gerade wenn man auf der Startseite ein weniger perfomantes Contao Modul einsetzt (Events-Modul mit > 5000 Events), hat man schnell Ladezeiten, die wenig erfreulich sind.
Das ist richtig. Das wäre dann aber, wie gesagt, der Speed und nicht die Funktionsweise :-) Ich würd’s nur gerne in der 3.5 haben, weil’s ein grösserer Change ist und die 3.5 sowieso im Mai kommt. Bleibt es in der 3.4 in einem Bugfix-Release so muss es natürlich auch auf die 3.2 gebackported (Denglish ftw) werden :)
Für mich wäre 3.5 auch in Ordnung. In den Projekten, wo dies ein Problem war, läuft eh seit längerem ein Workaround, sodass das Problem dort nicht mehr relevant ist.
Hab die Änderungen in der 3.4 zurückgenommen und nach 3.5 portiert.
@dmolineus : wie sieht dieser workaround aus? wäre vielleicht auch für andere interessant
@fritzmg Dieser Workaround macht nichts anderes, als über den getCacheKey
Hook den Cache-Key zu manipulieren. In meinem Fall, wo es nur eine Sprache gibt, sehr einfach.
public function hookGetCacheKey($cacheKey)
{
if (\Environment::get('request') === '' || \Environment::get('request') === 'index.php') {
$cacheKey = 'empty.de-DE';
}
return $cacheKey;
}
Wenn man mehrere Sprachen hat, müsste man hier halt das Mapping zwischen den 2 und 5 Zeichen Sprache-Codes und auf die Fallback-Sprache mit implementieren.
There is still a bug in this issue! See #7909. Page caching doesn't work with multiple languages!
This is still a problem in Contao 3.5.25 (see https://community.contao.org/de/showthread.php?66351-Startseite-nicht-im-Seitencache for example).
en
.index
within the website root.echo 'FROM CACHE';
here and echo 'NOT FROM CACHE';
here.Accept-Language
of your browser to de
.NOT FROM CACHE
.NOT FROM CACHE
again, even though a cache file is present.This is due to the fact, that Contao will search for a cache key that consists of …/empty.
plus the primary Accept-Language
here: system/modules/core/controllers/FrontendIndex.php#L367-L371. If the page's language differs from that, the page cannot be served from cache.
However, since this only happens, when the internal cache is not active (after applying #8695), I consider this not much of an issue. You are unlikely to not use the internal cache in the productive environment.
Nach dem Update von einer Contao-Installation 3.3.7 auf 3.4.3 funktionierte der Seiten-Cache nicht mehr. Nach einigen Debuggen fiel mir auf, dass Contao nun die Seite mit "de-DE" cachte, in den Seiteneinstellungen jedoch das Sprachkürzel "de" hinterlegt war.
Daher hat Contao die Seite nicht aus dem Cache geladen obwohl die Seite auch als Sprachenfallback arbeitet.
Durch die Umstellung in den Seiteneinstellungen besteht jedoch das Problem, dass ein Browser, der lediglich ein "de" als Accept-Language sendet, wieder eine ungecachte Seite lädt.