Giter VIP home page Giter VIP logo

cache_warmup's Introduction

Cache-Warmup

Generiert den Cache vorab, so dass die Website bereits beim Erstaufruf performant läuft.

Screenshot

Wofür wird das Addon benötigt?

Manchmal hinterlegt man eine Website zur Ansicht auf einem Testserver. Häufig wird davor oder danach der REDAXO-Cache gelöscht, um veraltete Inhalte zu entfernen, die vielleicht noch aus der Entwicklungszeit enthalten sind. Danach allerdings müssen alle Inhalte neu generiert werden. REDAXO übernimmt dies eigenständig beim Aufruf jeder Seite.

Diese initialen Seitenaufrufe können leider recht langsam sein, vor allem, wenn der Cache für viele Bilder generiert werden muss. Nutzer*innen, denen die technischen Hintergründe nicht bekannt sind, und die erstmalig die Website anschauen, könnten nun (fälschlicherweise) annehmen, REDAXO sei nicht sonderlich schnell. Verständlich, denn sie erhalten im ersten Moment keine performante Website.

Das Cache-Warmup-Addon kann alle verwendeten Inhalte der Website vorab generieren, so dass danach niemand mehr unnötig lange warten muss.

🐿 Protip: Weil Cache-Warmup alle Bilder und Seiten einmal durchläuft, ist es nebenher sehr nützlich, um zu prüfen, ob die Website fehlerfrei ausgeliefert wird. Ob also keine Bilder zu groß sind, um vom Webserver verarbeitet zu werden, und ob alle Templates und Module richtig funktionieren.


🤕 Fehler beim Warmup-Prozess

Es kommt immer wieder vor, dass Cache-Warmup nicht vollständig durchläuft, sondern vorher mit einem Fehler abbricht. An dieser Stelle ein paar Infos dazu, welche Fehler vorkommen können, und wie du damit umgehen kannst:

RAM exceeded (internal)

Ursache:
Der Arbeitsspeicher des Webservers reicht nicht aus, um alle Bilder zu verarbeiten. Dies ist ein Problem für deine Website, denn es bedeutet, dass die betroffenen Bilder nicht von REDAXOs Media Manager ausgegeben werden können, sondern stattdessen ein Fehlerbild angezeigt wird.

Maßnahmen:
Du solltest nun unbedingt deinen Medienpool prüfen und alle übergroßen Bilder — das betrifft nicht die Dateigröße, sondern die Pixel! — manuell verkleinern und neu hochladen. Wenn beispielsweise Bilder in deinem Medienpool liegen, die mit einer Digitalkamera aufgenommen worden sind und unbearbeitet hochgeladen wurden, dann sind sie womöglich ~6000 Pixel breit, und REDAXO würde mehr RAM benötigen, um davon Thumbnails zu erstellen, als auf typischen Webspaces verfügbar ist. Wenn du sie auf ~3000 Pixel verkleinerst und neu in den Medienpool lädst, sollte es hoffentlich klappen!
Wenn möglich, kannst du alternativ auch einfach den Arbeitsspeicher des Webservers vergrößern. 256 MB sollten gut funktionieren, wenn du mit großen Bildern arbeitest.

Request Timeout (408)

Ursache:
Das Generieren des Caches dauert zu lange, so dass die maximale Skriptlaufzeit (max_execution_time) des Webservers überschritten wird. Cache-Warmup versucht zwar, abhängig von der Skriptlaufzeit den Cache in kleinen Schritten zu generieren, aber manchmal — etwa bei sehr großen Bildern im Medienpool oder aufwendigen Templates/Modulen — sind selbst kleine Schritte noch zu groß.

Maßnahmen:
Du kannst Cache-Warmup verlangsamen, indem du diesen Code-Schnipsel in die boot.php des project-AddOns steckst. Der Wert für $throttle entspricht der Geschwindigkeit (1–100 in Prozent) und kann von dir angepasst werden. Im Code-Schnipsel wird beispielhaft mit 50% gearbeitet, so dass Cache-Warmup nur noch halb so schnell arbeitet wie üblich:

// decelerate Cache Warmup addOn
rex_extension::register('PACKAGES_INCLUDED', function () {   
    $addon = rex_addon::get('cache_warmup');
    $throttle = 50; // percent %

    $addon->setConfig('chunkSizeImages', ceil($addon->getConfig('chunkSizeImages') * $throttle / 100));
    $addon->setConfig('chunkSizePages', ceil($addon->getConfig('chunkSizePages') * $throttle / 100));
});

Internal Server Error (500)

Ursachen:
Dieser Fehler kann verschiedene Ursachen haben. Manchmal entsteht er aufgrund von Fehlern im PHP-Code, z. B. innerhalb von Templates oder Modulen. In solchen Fällen müsstest du das Problem eigentlich auch auf der Website sehen, wenn du die betroffenen Seiten aufrufst.

Maßnahmen:
Cache-Warmup bearbeitet normalerweise mehrere Seiten in einem Rutsch (etwa 100 bis 1000) und kann leider nicht unterscheiden, auf welchen davon Fehler auftreten. Um das herauszufinden, kannst du den Warmup für jede Seite einzeln durchlaufen lassen, indem du diesen Code-Schnipsel in die boot.php des project-AddOns mit aufnimmst:

// run Cache Warmup addOn in single page mode
rex_extension::register('PACKAGES_INCLUDED', function () {   
    rex_addon::get('cache_warmup')->setConfig('chunkSizePages', 1);
});

Womöglich dauert der Warmup-Vorgang nun sehr lange, das ist leider nicht zu ändern. Aber die URL der Fehlerseite liefert dir nun zumindest die ID samt ctype der Seite, auf der das Problem aufgetreten ist.


Extension Points (EP)

Das AddOn stellt verschiedene Extension Points bereit, um in die Auswahl der Artikel und Bilder, deren Cachefiles generiert werden sollen, manuell einzugreifen. Dies kann nützlich sein, um etwa Bilder zu ergänzen, die aus verschiedenen Gründen nicht vom AddOn erfasst worden sind, oder um bestimmte Kategorien oder Medientypen vom Generieren des Caches auszuschließen.

Extension Point Beschreibung
CACHE_WARMUP_GENERATE_PAGE Enthält den zu generierenden Artikel und die Sprache. Kann verwendet werden, um Artikel anhand verschiedener Kriterien auszulassen, wenn der Cache generiert wird.
CACHE_WARMUP_GENERATE_IMAGE Enthält das zu generierende Bild und den Medientyp. Kann verwendet werden, um Bilder anhand verschiedener Kriterien auszulassen, wenn der Cache generiert wird.
CACHE_WARMUP_IMAGES Ermöglicht, die Liste der vom AddOn ausgewählten Bilder zu bearbeiten.
CACHE_WARMUP_MEDIATYPES Ermöglicht, die Liste der vom AddOn ausgewählten Medientypen zu bearbeiten.
CACHE_WARMUP_PAGES_WITH_CLANGS Liefert alle zu generierenden Artikel in ihren Sprachen. Kann verwendet werden, um die Artikelliste zu bearbeiten, vor allem, um weitere Artikel mit Angabe der Sprache zu ergänzen.
CACHE_WARMUP_IMAGES_WITH_MEDIATYPES Liefert alle zu generierenden Bilder mit ihren Medientypen. Kann verwendet werden, um die Bilderliste zu bearbeiten, vor allem, um weitere Bilder mit Angabe des Medientyps zu ergänzen.

Anwendungsbeispiele für die Nutzung von EPs

Die Beispiele zeigen verschiedene Anwendungsfälle und können beispielsweise in der boot.php des project-AddOns hinterlegt werden.

CACHE_WARMUP_GENERATE_PAGE

Dieser EP wird unmittelbar vorm Generieren der Cachefiles jedes einzelnen Artikels angesprochen und ermöglicht, anhand verschiedener Kriterien den Artikel zu überspringen. Das Codebeispiel zeigt verschiedene Anwendungsfälle:

rex_extension::register('CACHE_WARMUP_GENERATE_PAGE', function (rex_extension_point $ep) {
    list($article_id, $clang) = $ep->getParams();

    $article = rex_article::get($article_id);

    // Artikel mit ID 42 auslassen
    if ($article_id == 42) {
        return false;
    }

    // Artikel der Kategorie 23 und deren Kindkategorien auslassen
    if (in_array(23, $article->getPathAsArray())) {
        return false;
    }

    // Sprache mit clang 2 komplett auslassen
    if ($clang == 2) {
        return false;
    }

    return true;
});

CACHE_WARMUP_GENERATE_IMAGE

Dieser EP wird unmittelbar vorm Generieren der Cachefiles jedes einzelnen Bilders angesprochen und ermöglicht, anhand verschiedener Kriterien das Bild zu überspringen. Das Codebeispiel zeigt verschiedene Anwendungsfälle:

rex_extension::register('CACHE_WARMUP_GENERATE_IMAGE', function (rex_extension_point $ep) {
    list($image, $mediaType) = $ep->getParams();

    $media = rex_media::get($image);
    if ($media) {
        if ($media->isImage()) {

            // Bilder vom Typ SVG auslassen
            if ($media->getExtension() == 'svg') {
                return false;
            }
           
            // Bilder der Kategorie 2 auslassen
            if ($media->getCategoryId() == 2) {
                return false;
            }

            // MediaType 'photos' ausschließlich für Bilder der Kategorie 3 verwenden
            if ($mediaType == 'photos' && $media->getCategoryId() != 3) {
                return false;
            }

            // MediaType 'fullscreen' auslassen
            if ($mediaType == 'fullscreen') {
                return false;
            }

            // Interne REDAXO-MediaTypes (beginnen mit 'rex_') auslassen
            if (strpos($mediaType, 'rex_') !== false) {
                return false;
            }
        }
        rex_media::clearInstance($image);
    }
    return true;
});

CACHE_WARMUP_IMAGES

Über diesen EP kann die Liste der vom AddOn erfassten Bilder modifiziert werden, um z. B. Bilder aus der Liste zu entfernen, deren Cachefiles nicht generiert werden sollen, oder um Bilder zu ergänzen, die aus verschiedenen Gründen nicht vom AddOn erfasst worden sind.

rex_extension::register('CACHE_WARMUP_IMAGES', function (rex_extension_point $ep) {
    $images = $ep->getSubject();

    // Bilder hinzufügen
    $images[] = 'dave-grohl.jpg';
    $images[] = 'pat-smear.jpg';
    $images[] = 'nate-mendel.jpg';
    $images[] = 'taylor-hawkins.jpg';
    $images[] = 'chris-shiflett.jpg';

    return $images;
});

CACHE_WARMUP_MEDIATYPES

Über diesen EP können die im System hinterlegten Mediatypen modifiziert werden, um z. B. Mediatypen aus der Liste zu entfernen, die nicht zum Generieren von Cachefiles verwendet werden sollen, oder um eigene Mediatypen zu ergänzen.

rex_extension::register('CACHE_WARMUP_MEDIATYPES', function (rex_extension_point $ep) {
    $mediaTypes = $ep->getSubject();
    foreach ($mediaTypes as $k => $mediaType) {

        // MediaType 'content' auslassen
        if ($mediaType === 'content') {
            unset($mediaTypes[$k]);
        }

        // REDAXO-MediaTypes auslassen
        if (strpos($mediaType, 'rex_') !== false) {
            unset($mediaTypes[$k]);
        }
    }
    return $mediaTypes;
});

CACHE_WARMUP_PAGES_WITH_CLANGS

Liefert alle zu generierenden Artikel in ihren Sprachen. Kann verwendet werden, um die Artikelliste zu bearbeiten, vor allem, um weitere Artikel mit Angabe der Sprache zu ergänzen, z. B. solche Artikel, die aufgrund ihres Offline-Status’ nicht vom AddOn erfasst worden sind.

rex_extension::register('CACHE_WARMUP_PAGES_WITH_CLANGS', function (rex_extension_point $ep) {
    $pages = $ep->getSubject();

    // Seite hinzufügen (article_id, clang)
    $pages[] = array(12, 1);
    $pages[] = array(12, 2);

    return $pages;
});

CACHE_WARMUP_IMAGES_WITH_MEDIATYPES

Liefert alle zu generierenden Bilder mit ihren Medientypen. Kann verwendet werden, um die Bilderliste zu bearbeiten, vor allem, um weitere Bilder mit Angabe des Medientyps zu ergänzen.

🐿 Protip: Dieser EP ist sehr nützlich im Umgang mit responsive Images und virtuellen Medientypen!

rex_extension::register('CACHE_WARMUP_IMAGES_WITH_MEDIATYPES', function (rex_extension_point $ep) {
    $images = $ep->getSubject();

    // Bild mit MediaType hinzufügen
    $images[] = array('dave-grohl.jpg', 'portrait');

    // Liste von Bildern mit Liste von MediaTypes hinzufügen
    $imagesToAdd = array(
        'pat-smear.jpg',
        'nate-mendel.jpg',
        'taylor-hawkins.jpg',
        'chris-shiflett.jpg'
    );
    $mediaTypesToAdd = array(
        'type1',
        'type2',
        'type3'
    );
    foreach ($imagesToAdd as $image) {

        // Prüfen, Bilder vorhanden ist
        $media = rex_media::get($image);
        if ($media) {
            if ($media->isImage()) {

                // Bild mit Medientyp hinfügen
                foreach ($mediaTypesToAdd as $mediaType) {
                    $images[] = array($image, $mediaType);
                }
            }
            rex_media::clearInstance($image);
        }
    }

    return $images;
});

Ich bin Entwickler*in. Was genau macht das Addon?

  1. Es werden alle Bilder erfasst, die in Modulen, Metainfos und yforms verwendet werden, sowie alle definierten MediaTypes des Media Managers. Verschiedene Extension Points (EPs) ermöglichen, die Liste der ausgewählten Bilder und MediaTypes zu bearbeiten, um zu kontrollieren, welche Cachefiles erstellt werden.
  2. Es werden alle Seiten erfasst, die online sind, sowie alle Sprachen. Verschiedene Extension Points (EPs) ermöglichen, die Liste zu bearbeiten.
  3. Aus den erfassten Daten wird ein großes Array erstellt mit Einträgen für jedes Bild mit jedem MediaType und jeder Seite in jeder Sprache. Beispiel: 10 Bilder mit 5 MediaTypes = 50 Bilder. 100 Seiten in 3 Sprachen = 300 Seiten.
  4. Das große Array wird danach in viele Häppchen zerhackt, deren Größe von der Skriptlaufzeit des Servers abhängt. Damit kann später gesteuert werden, wie viele Cachefiles bei jedem Request erstellt werden. Bilder benötigen dabei natürlich massiv mehr Serverressourcen als Seiten.
  5. Das Array wird als JSON im HTML des Popups ausgegeben, das das Generieren des Caches triggert, den Fortschritt zeigt und Infos ausgibt. Das Popup parst das JSON und sendet häppchenweise AJAX-Requests an einen Generator.
  6. Der Generator erstellt die Cachefiles für Bilder und Seiten. Die Angaben dazu, welche Bilder mit welchen Mediatypen und welche Seiten in welchen Sprachen erstellt werden sollen, befinden sich im Query string der URL jedes AJAX-Request.

cache_warmup's People

Contributors

alxndr-w avatar christophboecker avatar gharlan avatar ingowinter avatar interweave-media avatar nandes2062 avatar schuer avatar staabm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cache_warmup's Issues

Fehler über https

Cache_Warmup funktioniert bei mir nicht wenn ich das Redaxo-backend via https aufrufe.
In Chrome kommt ein "TOO MANY REDIRECTS" Fehler, in Firefox kam ein "301 MOVED PERMANENTLY". Über http funktioniert es normal. Keine Ahnung ob das was mit Serverkonfiguration zu tun hat oder mit dem Addon.

Fehlermeldung bei Multi-Domain-Site mit yrewrite

Ich habe yrewrite mit zwei Domains (www.example.com und sub.example.com) eingerichtet.
Melde ich mich im Backend nur mit www.example.com/redaxo an, dann wird eine Fehlermeldung ausgegeben:

Verdammt, etwas ist schief gelaufen!

Beim Erzeugen des Caches ist ein Fehler aufgetreten. Details befinden sich auf der Fehlerseite. Wir freuen uns über jede Mithilfe, die Qualität des Addons zu verbessern, indem Fehler bei Github gemeldet werden. Vielen Dank!

(0) → Link zur Fehlerseite

Der Link zur Feherlseite führt zur Startseite der zweiten Domain sub.example.com.

Wenn ich mich aber vorher bei beiden Domains unter Redaxo anmelde (www.example.com/redaxo und sub.example.com/redaxo), dann läuft die Cache-Generierung ohne Fehler durch.

NACHTRAG:
Nach weiteren Tests hat sich herausgestellt, dass die Cache-Generierung nur von sub.example.com aus ohne Fehler durchläuft. Der Aufruf von www.example.com funktioniert nicht.

jQuery.Deferred exception: Handlebars (R 5.11)

die console wirft folgenden fehler:

jquery.min.js:2 jQuery.Deferred exception: Handlebars is not defined ReferenceError: Handlebars is not defined

und

Uncaught ReferenceError: Handlebars is not defined
cache-warmup.js:90:25

es handel sich um eine seite, die ich gerade frisch von rex 5.9 auf 5.11 aktualisiert habe... unter 5.9 läuft es noch

README.md als Hilfeseite integrieren

In der README stehen einige nützliche Dinge, etwa der Umgang mit Fehlern und die verschiedenen Extension Points. Es wäre sicherlich praktisch, die direkt im REDAXO-Backend zu haben.

Fehler bei Verwendung von exit(); in Template

Moin,
Cache-Warmup bricht mit Fehlercode "RAM exceeded" ab, wenn in einem Template exit(); verwendet wird.
Gelöst habe ich das jetzt, indem ich das exit(); für warmup ausschließe:

if($_GET['page']!='cache_warmup/generator') {exit;}

Funktioniert .... vielleicht kann man Cache-Warmup dazu bringen, den exit-Befehl zu ignorieren ....

Gruss, Marc

Bedienung über Konsole implementieren

kapture 2019-01-06 at 10 44 07

Im Branch console gibt es bereits einen recht fortgeschrittenen Stand. Allerdings wird noch die Fehlerbehandlung und der anschließende Report benötigt.

Ziele

  • Alle Fehler und Exceptions abfangen, so dass der Warmup-Prozess in jedem Fall bis zum Ende durchläuft (Ggfls. bietet sich dafür symfonys Process-Komponente an, um den Cache in einem Subprozess zu generieren)
  • Im Falle von Fehlern soll am Ende ein Report generiert werden, der aufzeigt, welche Cachefiles nicht generiert werden konnten.

Typische Fehlerfälle, und wie man sie zwecks Debugging nachstellt

  • Zu wenig RAM, um Thumbnails zu generieren. Kann sehr einfach nachgestellt werden, in dem ein beliebiges Bild mit sehr vielen Pixeln (etwa 15000x15000, kann auch nur ein einfarbiges PNG sein. Die Pixelwerte sind allein entscheidend für den RAM.) in den Medienpool geladen und dann in einem beliebigen Artikel oder Metadaten verwendet wird.
  • Fehler in Templates oder Modulen. Zum Nachstellen einfach irgendeinen Murks in ein Template schreiben.
  • Skriptlaufzeit überschritten. Zum Nachstellen am besten max_execution_time des Servers auf einen geringen Wert stellen (etwa 10 Sekunden) und die Cache-Warmup-Config so anpassen, dass absurd viele Cachefiles pro Request erstellt werden. Dafür wie hier beschrieben einfach mit $throttle = 1000; (1000%) arbeiten: https://github.com/FriendsOfREDAXO/cache_warmup#request-timeout-408 (Korrektur: Kommt in der Konsole nicht vor, ist nur ein clientseitiges Problem beim Warmup im REDAXO-Backend)

Ich arbeite zum Debuggen meist mit der Basis-Demo oder der Onepage-Demo, damit ich ein paar Inhalte im REDAXO habe, mit denen ich rumspielen kann.

Bilder werden in manchen Umgebungen zu groß generiert

Ich kann noch nicht genau beschreiben, woran es liegt und was da genau passiert. Es ist nur so, dass bei einer Installation, die ich hier lokal vorliegen habe, die Bilder zu groß generiert werden. Es wirkt so, als würden die Mediatypes nicht beachtet und jedes Bild in voller Größe generiert.

Der Cache-Warmup läuft fehlerfrei durch, aber ruft man danach den Medienpool auf, werden alle Thumbnails, die eigentlich 80 x 80 sein sollen, in voller Größe (in meinem Fall: 1920 x 1080) ausgegeben. Der Medienpool greift ja auf die bereits generierten Cachefiles zu, und diese sind zu groß.

Vermutlich geht beim extend der Klassen aus dem Media Manager noch irgendwas schief. Ich konnte das gestern nicht nachvollziehen, schaue mir das Problem aber bei Gelgenheit genauer an.

Falls jemand das Issue nachvollziehen kann: Help wanted! :)

Diverse Abbrüche

Krieg das Ding nicht zum laufen ... schade, die Idee ist wirklich super!
Aber ohne bessere Fehlerausgabe (wie schon mehrmals erwähnt) ist kaum rauszufinden, was nun wirklich stört.
Trotzdem mal einige Vermutungen und Anmerkungen ... vielleicht hilft es beim debugging:

  • bei meinem 'not found'-Artikel hängt es
  • Seiten mit Modul, welches jquery enthält
  • bei meheren Domains (über yrewrite)
  • bei Ajax-Content

Wenn ich mal etwas mehr Zeit habe werde ich mal genauer auf die Suche gehen .....

Umgang mit Fehlern anpassen, Report erstellen statt Abbruch

Aufgrund des Feedbacks in #66, #80 und #82 denke ich inzwischen, dass die Fehlerbehandlung wirklich angepasst werden sollte:

  1. Warmup läuft grundsätzlich durch und bricht nicht mehr mit Fehlern ab.
  2. Warmup merkt sich Vorkommen von Bildern, die nicht richtig generiert werden konnten (Speicherüberlauf) und auch Seiten, die nicht generiert werden konnten (z. B. aufgrund von exit; im Template), und es gibt nach dem Durchlauf einen Report aus.

Problem bei Punkt 2 könnte sein, dass Warmup mit jedem Request mehrere Seiten und Bilder generiert, und dass wir u. U. nicht sinnvoll herausfinden können, welche davon Fehler produziert haben. Falls dem so ist, müssten wir einen allgemeinen Report ausgeben im Sinne von »Einige Bilder konnten nicht verarbeitet werden.«.

Ggfls. beachten: Bedienung über die Konsole, und falls dafür ein bestimmtes Verhalten sinnvoll ist, etwa beim Report. Aber darum wird sich vermutlich eher @gharlan oder jemand anderes später kümmern, und es ist für dieses Ticket erstmal nicht relevant.

Mit keys statt values arbeiten um den speicherbedarf zu reduzieren

aktuell arbeiten wir in https://github.com/FriendsOfREDAXO/cache_warmup/blob/master/lib/selector.php mit einem array was gefüllt wird und am ende mittels array_unique() duplikate entfernt werden.

array_unique auf große arrays ist speicheritensiv.

-> anstatt die array values zu füllen könnte man auch mit keys arbeiten, da sich diese autom. überschreiben und so erst gar keine duplikate entstehen.
Ob es was bringt muss man natürlich ausprobieren ;-).

IST-Beispiel (https://3v4l.org/JeUEg):

$images = array();
$images[] = 'bild1.jpeg';
$images[] = 'bild1.jpeg';
$images[] = 'bild1.jpeg';
$images = array_unique($images);
var_dump($images); // -> array('bild1.jpg');

Vorschlag-Beispiel (https://3v4l.org/JMRcJ):

$images = array();
$images['bild1.jpeg'] = 1;
$images['bild1.jpeg'] = 1;
$images['bild1.jpeg'] = 1;
$images = array_keys($images);
var_dump($images); // -> array('bild1.jpg');

JavaScript: CS

Es sind mir ein paar Dinge durchgerutscht, die ich bei Gelegenheit verbessern könnte:

  • Private members in externen Kontexten (vor allem _config)
  • Benamung: parent passt nicht zu einer Instanz, die als Parameter erwartet wird
  • JSDoc teilweise unvollständig, Parameter fehlen

Exception in R <5.1 wegen fehlendem Feature 'Status (online/offline) für Sprachen'

Erst mit REDAXO 5.1 ist Status (online/offline) für Sprachen (siehe Release-Info) hinzugekommen, Cache-Warmup prüft jedoch das Feature vorher nicht, so dass in Versionen <5.1 eine Exception fliegt:

Error while executing statement using params [1,1]! SQLSTATE[42S22]: Column not found: 1054 Unknown column 'c.status' in 'where clause'

Entweder Prüfung einbauen oder REDAXO-Mindestversion auf 5.1 erhöhen. Ich persönlich würde gerne prüfen, denn abgesehen von diesem Feature sollte Cache-Warmup eigentlich problemlos auch mit 5.0 funktionieren. Zumindest hat es das zu Beginn der Entwicklung ;)

Probleme mit YRewrite und Multi-Domain-Setup

Nach Update auf Version 3.3.1

Erhalte ich beim Klicken auf "Cache jetzt gen.." => "Verdammt, etwas ist schief gelaufen! ...."

nginx error.log

2018/09/25 11:46:53 [error] 20605#20605: *422 FastCGI sent in stderr: "PHP message: Undefined variable: item
PHP message: Undefined variable: item
PHP message: Undefined variable: item
PHP message: Undefined variable: item
......

Re-Install wurde durchgeführt
De-Install + Löschen + Neu-Install wurden durchgeführt

Gleiche Resultat

Downgrade auf 3.2 => Gleiche Resultat im Log

Versionen:
REDAXO 5.6.2
PHP 7.0.31
MySQL 5.5.5-10

SVGs führen zu Fehler

cache_warmup bricht ab, wenn ein SVG durchlaufen wird. SVG-Dateien sollten dann übersprungen werden...

Funktioniert der noch?

Ich habe in letzter Zeit mehrfach auf unterschiedlichen Servern versucht das Addon zu nutzen und jedesmal kam die Meldung, dass ein Fehler aufgetreten ist ... mit einem Link zu einer Fehlerseite, die aber wenn ich sie anschauen will komplett weiss ist... Hab die neuste Version und das neuste Redaxo.

AddOn beachtet nicht "status" Spalte in "rex_article_slice"

Das AddOn bloecks fügt zur rex_article_sliceeine Status-Spalte hinzu, welche beim EP SLICE_SHOW beachtet wird. Anscheined greift das aber nicht in Verbindung mit dem cache_warmup. Es tauchen nach dem Ausführen des AddOns plötzlich alle inaktiven Slices wieder im Frontend auf (obwohl der Value nach wie vor auf "0" steht).

Kann sich das jemand mal ansehen? Ich hab es jetzt noch auf einer Dev-Seite getestet (mit zwei Seiten und zwei Bildern - es ist reproduzierbar)

Mit YForm 3 testen und Conflicts anpassen

Cache-Warmup erwartet zur Zeit noch YForm 2, das ist in der package.yml unter conflicts definiert:

yform: '>=3'

TODO:

  1. Prüfen, ob Cache-Warmup für die Verwendung mit YForm 3 angepasst werden muss, ob sich also an den Feldtypen etwas geändert hat:
    /* find images in yforms (be_media, be_medialist, mediafile) */

    Falls ja: Cache-Warmup so anpassen, dass es sowohl mit YForm 2 als auch mit dem neuen YForm 3 funktioniert.
  2. Conflicts anpassen

EP zum Filtern der zu generierenden Objekte

Diskussion in #86: Es sollte ein EP vorm Generieren der Cachefiles eingebaut werden, über den man bei Bedarf einhaken und steuern kann, welche Files womöglich nicht generiert werden sollen.

Speziell bei Medien geht es darum, gezielt Medientypen überspringen zu können, um die Anzahl der Cachefiles und den benötigten Speicherplatz zu reduzieren (etwa: Bilder der Kategorie A nicht mit den Medientypen X, Y und Z generieren).

Diskussion: Name des Addons

Der Name ist nur ein Schnellschuss und darf gern als provisorisch angesehen werden.
Weiß jemand einen besseren?

ChunkSize Parameter defaults

Die defaults für die chunk parameter exisitieren schon sehr lange. Seitdem wurden einige optimierungen im code durchgeführt, sodass wir die aktuellen werte hinterfragen sollten.

https://github.com/FriendsOfREDAXO/cache_warmup/blob/master/boot.php

Annahme: man kann deutlich höhere Werte benutzen sodass auch für seiten mit sehr vielen Bildern und MediaTypes das ganze schnell/schneller läuft. Ich habe nicht gestested was sinnvoll ist, aber ggf. Kann jmd Erfahrungswerte liefern für seiten mit einigen hundert Bildern

Min php version?

wie ist die min php version für das cache warmup addon? Sollte in der package.yml definiert sein..

Addon + customizer plugin

bildschirmfoto 2017-02-26 um 01 10 12

Eigentlich steht an der Stelle im Header der Link zum Frontend. Ich weiss nicht, ob hier cache_warmup aufräumen muss, oder aber das customizer-plugin.

Ggf. weiß hier @tbaddade bescheid!

R 5.3 Media Manager: Header prüfen und übernehmen

Die großen Anpassungen von neulich (#50) wurden zurückgenommen, allerdings sind ein paar kleine Anpassungen drin geblieben, die hier mal geprüft und ggfls übernommen werden sollten:

Komplette History: https://github.com/redaxo/redaxo/commits/master/redaxo/src/addons/media_manager/lib/media_manager.php

Speziell zum Status 200 beachten: Entspricht das immer noch dem zu erwartenden Verhalten in unserem JS? https://github.com/FriendsOfREDAXO/cache_warmup/blob/master/assets/js/cache-warmup.js#L398-L403

.done(function (data) {
    // special: error on success (http status 200)
    // media manager returns 200 even if an image cannot be generated (too big, RAM exceeded)
    // we assume an error if response starts with rex-page-header
    // otherwise page will return blank if stuff works out as expected
    if (data.substr(0, 30) === '<header class="rex-page-header') {

JS-Fehler & Popup-Größe

  • Fehler im JavaScript verhindern die Ausführung in Safari.
  • Das Popup öffnet im Safari in zu geringer Höhe, so dass Inhalte scollen.

Fehler durch Speicherüberlauf wird übergangen

Wie es scheint, werden Fehler durch Speicherüberlauf (»RAM exceeded«) aktuell nicht richtig abgefangen. Stattdessen läuft Cache-Warmup weiter und zeigt am Ende die positive Fertig-Danke-Nachricht. Siehe auch Thomas’ Kommentar und meine Antwort darauf.

Scheint ein JS-Issue zu sein, ich habe es mir aber noch nicht im Detail angeschaut.
Getestet mit REX 5.2 und REX 5.3.

Beschreibungstext auf Addon-Seite ergänzen

Nur eine Kleinigkeit für page=system/cache-warmup. Der Text könnte noch etwas hilfreicher sein:

Generiert den Cache für alle Seiten und verwendeten Bilder vorab, so dass die Website bereits beim ersten Aufruf performant läuft.

Hilfreiche Fehlerausgabe implementieren

Wenn Cachewarump einen Fehler erzeugt, wird einem ein Link angezeigt, der zum fehlerhaften Artikel / Bild führen soll. Klickt man auf den Link, passiert nichts, da dieser falsch aufgebaut zu sein scheint.

http://domain.de/redaxo/index.php?page=cache_warmup/generator&images=11.rex_mediapool_maximized,11.rex_mediapool_preview,10.art_image,10.download,10.gallery-flexslider,10.gallery-thumbnail,10.mblockslide,10.product,10.product-acetum-label,10.product-weingut-label,10.rex_mediabutton_preview,10.rex_medialistbutton_preview,10.rex_mediapool_detail,10.rex_mediapool_maximized,10.rex_mediapool_preview,8.art_image,8.download,8.gallery-flexslider,8.gallery-thumbnail,8.mblockslide,8.product,8.product-acetum-label,8.product-weingut-label,8.rex_mediabutton_preview,8.rex_medialistbutton_preview,8.rex_mediapool_detail,8.rex_mediapool_maximized,8.rex_mediapool_preview,7.art_image,7.download,7.gallery-flexslider,7.gallery-thumbnail,7.mblockslide,7.product,7.product-acetum-label,7.product-weingut-label,7.rex_mediabutton_preview,7.rex_medialistbutton_preview,7.rex_mediapool_detail,7.rex_mediapool_maximized,7.rex_mediapool_preview,6.art_image,6.download,6.gallery-flexslider,6.gallery-thumbnail,6.mblockslide,6.product,6.product-acetum-label,6.product-weingut-label,6.rex_mediabutton_preview

zu viele unbenötigte Cache-Bilder müllen den Webspace zu

In der Art und Weise, wie cache_warmup funktioniert, werden ja alle Medienprofile mit allen Bildern multipliziert. Das führt dazu, dass das ganze Cache-Verzeichnis vollgemüllt wird mit Bildkombinationen, die niemals benötigt werden. Im schlimmsten Fall - und das ist uns jetzt passiert - ist der Webspace voll und nichts geht mehr.

Das ist unbefriedigend. Stattdessen sollte es einen Modus geben, der nur das Frontend crawlt und die Bilder generiert, die auch tatsächlich benötigt werden. Oder einen Modus, der ausschließlich Artikel aufwärmt ohne Medien.

Systemlog: Deprecated-Meldung generateCache()

Non-static method cache_warmup_generator_pages::generateCache() should not be called statically, assuming $this from incompatible context
redaxo/src/addons/cache_warmup/pages/generator.php
Zeile 17

Diskussion: Wie implementieren?

Hey,

ich habe mir ein paar lose Gedanken zum Addon gemacht, die ich gern besprechen würde.

  • Eine Generierung der Inhalte (structure) vorab ist eigentlich unnötig, weil dies nur sehr wenig Zeit benötigt, oder?
  • Gleiches gilt für die URLs (yrewrite).
  • Relevant sind eigentlich nur die Bilder (media manager), denn die benötigen viel Zeit. Zudem kann hier potentiell was schiefgehen, wenn z. B. zu wenig RAM verfügbar ist. Eine Vorab-Generierung ist damit gleichzeitig auch Vorab-Check und erspart Fehler beim Aufruf durch Benutzer.
  • Sollte sonst noch irgendwas vorab generiert werden?

Welche Methode implementieren?

  1. Einmal durch alle Seiten oder alle Slices in allen Sprachen laufen, Inhalte generieren und daraus Aufrufe des Media Managers parsen. Vermutlich nicht die performanteste Lösung von allen, und es werden erstmal keine Bilder in yforms beachtet. Die müsste man nachträglich erfassen.
  2. Für alle Bilder innerhalb des Medienpools Thumbnails in allen Mediatypen generieren. Sicherlich eine unnötig speicherintensive Methode, denn in der Praxis werden oftmals nicht alle Bilder, die in den Medienpool geladen wurden, auch wirklich verwendet.
  3. Die Datenbank nach Vorkommen von media1-10 und medialist1-10 durchwühlen. Damit wären alle verwendeten Bilder erfasst, jedoch nicht die verwendeten Mediatypen. Stattdessen würde man vermutlich schlicht Thumbnails für alle Mediatypen generieren, was den Nachteil hätte, dass es viel Speicherplatz einnimmt, jedoch den Vorteil hätte, dass alle Vorkommen abgedeckt sind, etwa auch innerhalb des REDAXO-Adminbereichs.
  4. Andere Ideen?

Mir scheint Variante 3 sinnvoll. Was meint ihr?

User Interface:

  • Mein Gedanke war, dass die Warm-up-Aktion ein Popup öffnet, in dem die Queue abläuft. Das hätte den Vorteil, dass man nicht auf der Seite bleiben muss, solange der Prozess läuft, sondern im REDAXO weiterarbeiten kann.
  • Sonstige Anregungen?

CSRF-Token nutzen

Beim Request auf den Generator sollte ein CSRF-Token mitgegeben und validiert werden, bevor die Cachefiles generiert werden.

Warnings im Systemlog

Jede Menge Warnings im Systemlog
Cannot modify header information - headers already sent by

Vielleicht kann man das durch

        while (ob_get_length()) {
            ob_end_clean();
        }

unterdrücken ...

REDAXO 5.3 Fehler

ErrorException thrown with message "Cannot make static method rex_media_manager::sendMedia() non static in class cache_warmup_media_manager"

Stacktrace:
#0 ErrorException in /var/www/clients/client1/web205/web/public/redaxo/src/addons/cache_warmup/lib/media_manager.php:0

bildschirmfoto 2017-02-11 um 17 40 49

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.