[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Eigenes last-modified im Header und allgemeine Performance - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Thomas-S
Beiträge: 43
Registriert: 1. Jun 2007, 09:30
Wohnort: Forst
Kontaktdaten: Website

Eigenes last-modified im Header und allgemeine Performance

22. Nov 2012, 16:32

Hallo,

Aktuell habe ich ein Projekt, wo sich die meiste Zeit mehr als 200 User gleichzeitig tummeln. Bevor ich im stillen Kämmerlein kraft meines Halbwissens drauflos optimiere, hier meine Überlegungen und die Frage, was Ihr in so einem Fall macht. (für meine bisherigen Redaxo-Projekte war die Performance immer OK)

Mir ist aufgefallen, dass in einer normalen Redaxo Installation das generieren der Navigation ca. 20% bis 30% der Script Zeit ausmacht, sobald die Navigation mehr als 1 Ebene hat.
Ich habe verschiedene Navigationsscripte hier aus dem Forum getestet (auch factory), die Unterschiede waren eher gering. Was mich etwas stört ist, dass die Navigation ständig neu berechnet und nicht gecached wird, auch wenn sie sich tagelang nicht ändert.
Jetzt habe ich folgendes gemacht:
Die komplette Navigation wird bei Aufruf des Artikels in den APC User Cache (ähnlich Memcache) geschoben (Key ist die Kategorie ID). Damit habe ich bei einer Navigation mit 15 Elementen + Home 16 Cache Einträge. Wird der Artikel das zweite mal aufgerufen, ist Redaxo 20% schneller. (für die Script-Time des APC Abrufs werden 0ms angezeigt )
Über den Extension Point CAT_UPDATED lösche ich diese Cache-Dateien sobald sich etwas an den Kategorien ändert.


Wie funktioniert das Redaxo eigene Caching eigentlich? Das Verzeichnis "cache" in "generated" ist normal leer? Es werden nur die Templates und die Artikel Slices als File abgelegt.
Kann man da eingreifen und Daten in den APC / Memcache lenken oder optimieren?


Die Optionen für last_modified und ETAG in der master.inc kann ich nicht pauschal aktivieren weil sich diese Funktionen das updatedate des Artikels für das Änderungsdatum im Header greifen und einige meiner Artikel dynamisch sind d.h. deren Inhalt wird aus anderen Datenbankabfragen zusammengebaut. d.h. Artikel ID gleich aber URL und Seiteninhalt anders.
Es ist aber ein last_modified für diese dynamischen Daten bekannt, welches sich zwischen 1 und vielleicht 10 mal am Tag ändert. Da die URL's per get immer eindeutig sind könnte man den Browsercache schon nutzen auch wenn es nur für ein paar Stunden ist. Kann man das last_modified in der rex_send_article überschreiben oder besser einen eigenen Header am Anfang des Templates bauen?

Ich bin da wie gesagt noch am Anfang. Habe im Forum nur wenig zum Thema Performance- Optimierung gefunden.

Wenn ich eine überschaubare Anzahl an URL's ohne weitere Dynamik hätte, wäre es einfach, den Output Filter der index.php gezippt in den APC zu legen. Beim nächsten Aufruf käme die komplette Seite vorkomprimiert aus dem RAM ;-)

Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

Re: Eigenes last-modified im Header und allgemeine Performan

12. Dez 2012, 22:53

hi,
kann dir jetzt leider nicht helfen. allerdings würd mich das hier
interessiern:
Die komplette Navigation wird bei Aufruf des Artikels in den APC User Cache (ähnlich Memcache) geschoben (Key ist die Kategorie ID). Damit habe ich bei einer Navigation mit 15 Elementen + Home 16 Cache Einträge. Wird der Artikel das zweite mal aufgerufen, ist Redaxo 20% schneller. (für die Script-Time des APC Abrufs werden 0ms angezeigt )
Über den Extension Point CAT_UPDATED lösche ich diese Cache-Dateien sobald sich etwas an den Kategorien ändert.
kannst du mir das bitte kurz erläutern, was und wie man das macht.
danke. grz chris

Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

Re: Eigenes last-modified im Header und allgemeine Performan

13. Dez 2012, 02:33

Thomas-S hat geschrieben:Was mich etwas stört ist, dass die Navigation ständig neu berechnet und nicht gecached wird, auch wenn sie sich tagelang nicht ändert.
Im Falle der rex_navigation konnte man überlegen dort direkt ein caching einzubauen.. der Einfachheit halber wie bei den articles, sprich je ein cachefile pro id/clang Kombi.. updates via EPs so wie du es mit deinem APC machst..
Wie funktioniert das Redaxo eigene Caching eigentlich? Das Verzeichnis "cache" in "generated" ist normal leer?
Redaxo selbst legt nur die Unterordner articles/files/templates an, und dort lagern die diversen cachefiles.. sowohl vom core, als auch von diversen Addons. Wenn du einen Ordner "cache" dort hast, dann kommt der vermutl. von einem Addon..
..nur die Templates und die Artikel Slices als File abgelegt.
Ne, schon deutlich mehr.. am einfachsten mal bei ner "laufenden Seite" (z.b. Demo) dort reinkucken was es alles anspült.. obacht: die cachefiles werden erst bei einem frontend Aufruf sukzessive/on demand angelegt
Kann man da eingreifen und Daten in den APC / Memcache lenken oder optimieren?
Programmatisch eingreifen (afaik) nicht, aber an die files kommst du ran und kannst sie natürlich in $irgendeiner Form weiterverwenden..
.. das updatedate des Artikels für das Änderungsdatum im Header greifen und einige meiner Artikel dynamisch sind .. Kann man das last_modified in der rex_send_article überschreiben oder besser einen eigenen Header am Anfang des Templates bauen?
Ob man mit einem eigenen header ein bereits geschicktes lastmodified nochmal überschreiben kann weiß ich nicht.. wäre aber auch sperrig imho. Ich persönlich würde in deinem Fall rex_send_last_modified() patchen und einen EP (ExtensionPoint) einbauen, damit du nochmal an dem Wert für lastmodified drehen kannst.. so etwa (ungetestet):

Code: Alles auswählen

function rex_send_last_modified($lastModified = null)
{
  if(!$lastModified)
    $lastModified = time();

  $lastModified = date('r', $lastModified);

  $lastModified = rex_register_extension_point('LAST_MODIFIED',$lastModified);
  ...
vg, Jan

Thomas-S
Beiträge: 43
Registriert: 1. Jun 2007, 09:30
Wohnort: Forst
Kontaktdaten: Website

Re: Eigenes last-modified im Header und allgemeine Performan

13. Dez 2012, 09:28

@darwin:
hab im Haupt-Template folgendes um den Aufruf des Navi-Templates geschrieben:

Code: Alles auswählen

// APC Key für die Navi besteht aus der Kategorie-ID
// apc_exists Funktion hier nochmal definieren kann bei neuestem APC entfallen
$cacheid = 'navi_'."REX_CATEGORY_ID";
if(!function_exists('apc_exists')){
  function apc_exists($keys){
    $r;
    apc_fetch($keys,$r);
    return $r;
  }
}
// Cache auslesen wenn vorhanden ansonsten die Navi aus template 11 generieren und in APC speichern
if(apc_exists($cacheid) != false)
{
  $navigation = apc_fetch($cacheid);
} else {
  $navTemplate = new rex_template(11);
  include $navTemplate->getFile();
  apc_store($cacheid, $navigation, 0);
} 
das könnte man ähnlich mit allen Daten im Template machen, die viel Performance brauchen und gecached werden können. z.B aufwendige Berechnungen etc.
Die Frage ist dann, wie lösche ich den Cache, sobald er nicht mehr aktuell ist. Bei der Navi hab ich das mit der Änderung der Kategorien verknüpft. (In einem Addon)

Code: Alles auswählen

/**
 * Navicache Dateien aus APC löschen, wenn Kategorie geändert ode angelegt wird
 */
function clear_navicache_apc() {
  // APC Iterator funktioniert auf Testsystem nicht APC Version zu gering
  //   apc_clear_cache('user');
  //   $toDelete = new APCIterator('user', '/^navi_/',APC_ITER_KEY);
  //   apc_delete($toDelete);

  // Alternative zu APCIterator. alle Cache Dateien die mit navi beginnen löschen
  $aCacheInfo = apc_cache_info('user');
  foreach($aCacheInfo['cache_list'] as $_aCacheInfo)
    if(substr($_aCacheInfo['info'], 0,4) == 'navi') apc_delete($_aCacheInfo['info']);
}

// Auslöser ist der Extension Point dür die Kategorie
rex_register_extension('CAT_UPDATED','clear_navicache_apc');
rex_register_extension('CAT_DELETED','clear_navicache_apc');
rex_register_extension('CAT_STATUS','clear_navicache_apc');


// optional noch folgendes
// Funktion zum löschen des gesamten User-Caches im APC
function clear_apc() {
  apc_clear_cache('user');
}

// wenn in Systemeinstellungen der Cache per Button gelöscht wird, dann auch APC Usercache komplett löschen
rex_register_extension('ALL_GENERATED','clear_apc'); 
Wenn der Inhalt der Seite nicht dynamisch ist und komplett aus dem "Standard" Redaxo kommt und es sich um wenige dutzend Seiten handelt, könnte man den Ausgabe Puffer der komplette Seiten per ob_get_contents(); in den APC legen. Performancegewinn wäre dann wohl Faktor 1000 ;-)
Der Aufwand lohnt wirklich nur bei hochfrequentierten Seiten.
Voraussetzung ist ein Hosting mit APC. (normale Web-Spaces beim Massenhoster haben das nicht, weil dann könnten sie niemals 100 Kunden auf einen Server pressen, der APC würde dann aller paar Minuten überlaufen )

Zurück zu „Allgemeines [R4]“