Listing extrem langsam (Shopware 5.6.9)

Ich habe rund 100’000 Artikel im Shop, davon etwa 60’000 aktiv. Keine Varianten Artikel.
Nun habe ich das Problem dass beim Aufruf einer Kategorieseite sehr lange dauert wenn der HTTP-Cache ausgeschaltet ist.
In einer Überkategorie mit 2311 Ergebnissen dauert es 30-60 Sekunden.
Eine Unterkategorie mit 700 Artikel dauert rund 5-15 Sekunden.
Eine Unterkategorie mit 11 Artikeln rund 2-3 Sekunden.

Der Server ist sehr schnell.
Die SQL Time ist jeweils unter 0.01 ms, also kann es nicht die Datenbank sein.

Ich sehe mit dem Profiler Plugin dass Enlight_Controller_Plugins_ViewRenderer_Bootstrap::onPostDispatch
sowie
Shopware_Plugins_Frontend_Seo_Bootstrap::onFilterRender
Praktisch all die Zeit verbrauchen.

Nun habe ich komplett alle Plugins (bis auf Profiler) deinstalliert / deaktiviert.
Ich habe auf das Standard-Template gewechselt.

Doch das alles hat nichts gebracht. Was kann das sein?
Merkwürdig ist dass die SQL Abfrage sehr schnell gehen, aber der Aufbau, je mehr Artikel es in der Kategorie hat, umso länger geht. Wenn ich dann aber einen Filter verwende, welcher Artikel mittels Ajax nachlädt, geht dies wiederum blitzschnell.

Ich wärme im Normalbetrieb den Cache auf mittels /bin/console sw:warm:http:cache -b 8 -k -o -t -n
Das Aufwärmen aller 870 Kategorieseiten dauert dort nur rund 61 Sekunden!

Habe nun rausgefunden dass es am HtmlMinifier von Shopware liegt. Dieser wird bei viel Quellcode extrem langsam.
Habe nun das file /engine/Shopware/Components/Template/HtmlMiniCompressor.php abgeändert und den Code hier verwendet: https://stackoverflow.com/a/6225706

1 „Gefällt mir“

Wie hast du es herausgefunden? Welches Tool hast du eingesetzt?

VG

Ich habe mittels dem Profiler Plugin die Funktion ausfindig gemacht welche sehr lange braucht und mir dann diese genau angeschaut. So bin ich relativ schnell auf den HtmlMiniCompressor gestossen.

Kannst du den Code deiner abgeänderten PHP Datei einmal posten?

/engine/Shopware/Components/Template/HtmlMiniCompressor.php

<?php
namespace Shopware\Components\Template;

class HtmlMinCompressor implements HtmlCompressorInterface
{
    public function minify(string $content): string
    {
        return myMinify($content);
    }
    
}     

    function myMinify($content) {

    //remove redundant (white-space) characters
    $replace = array(
        //remove tabs before and after HTML tags
        '/\>[^\S ]+/s'   => '>',
        '/[^\S ]+\</s'   => '<',
        //shorten multiple whitespace sequences; keep new-line characters because they matter in JS!!!
        '/([\t ])+/s'  => ' ',
        //remove leading and trailing spaces
        '/^([\t ])+/m' => '',
        '/([\t ])+$/m' => '',
        // remove JS line comments (simple only); do NOT remove lines containing URL (e.g. 'src="http://server.com/"')!!!
        '~//[a-zA-Z0-9 ]+$~m' => '',
        //remove empty lines (sequence of line-end and white-space characters)
        '/[\r\n]+([\t ]?[\r\n]+)+/s'  => "\n",
        //remove empty lines (between HTML tags); cannot remove just any line-end characters because in inline JS they can matter!
        '/\>[\r\n\t ]+\</s'    => '><',
        //remove "empty" lines containing only JS's block end character; join with next line (e.g. "}\n}\n</script>" --> "}}</script>"
        '/}[\r\n\t ]+/s'  => '}',
        '/}[\r\n\t ]+,[\r\n\t ]+/s'  => '},',
        //remove new-line after JS's function or condition start; join with next line
        '/\)[\r\n\t ]?{[\r\n\t ]+/s'  => '){',
        '/,[\r\n\t ]?{[\r\n\t ]+/s'  => ',{',
        //remove new-line after JS's line end (only most obvious and safe cases)
        '/\),[\r\n\t ]+/s'  => '),'
         );
    $content = preg_replace(array_keys($replace), array_values($replace), $content);

    return $content;
  }

Der Code ist mega und hat uns sehr gut geholfen, allerdings ist dadurch ein Problem entstanden.

In dem Button „In den Warenkorb“ ist nun zusammengeschrieben „In denWarenkorb“ und im Kundenaccount ist Vor- und Nachname zusammengeschrieben. das sind zwei Punkte, die mir aufgefallen sind.

Liegt an der Zeile:

    //remove empty lines (between HTML tags); cannot remove just any line-end characters because in inline JS they can matter!
    '/\>[\r\n\t ]+\</s'    => '><',

Ich frage mich, warum an den beiden Stellen. Was ist hier anders, dass der Fehler passiert.

Jemand eine Ahnung wie man das löst? also klar hab die Zeile jetzt rausgenommen.

Aber, so dass die Funktion an anderen Stellen greift.