• So, Optimierungsbedarf.

    admin/includes/modules/cseo/commerce_seo_url.php, from line 105

    1. Jeder Scriptaufruf holt alle product_id aus products_description. Danach wird pagination durchgeführt ("for ($i = $offset; $i <= $limit; $i++)"). Überlasse doch diese Aufgabe an MySql-Server:
    http://dev.mysql.com/doc/refman/5.6…timization.html
    "SELECT products_id FROM " . TABLE_PRODUCTS_DESCRIPTION . " ORDER BY products_id LIMIT $offset, $step"
    Für ORDER BY products_id wird ein Index für "products_id"-Spalte benötigt.

    2. Die Tabelle products_description enthält Lokalisierungen für alle Sprachen, somit kommen ins Abfrageergebnis alle products_id mal Anzahl Sprachen. Später in inc/commerce_seo.inc.php, line 599 werden sowieso alle lokalisierte Namen abgefragt.

    Code
    $product_query = xtDBquery("SELECT
        products_id,
        language_id,
        products_name,
        products_url_alias,
        url_old_text
        FROM
        " . TABLE_PRODUCTS_DESCRIPTION . "
        WHERE products_id=" . $productID);


    Es ergibt sich, dass jedes Produkt genau so viel mal abgearbeitet wird, wie die Anzahl Sprachen. Denkbar wäre noch DISCTINCT dazu:
    "SELECT DISTINCT products_id FROM " . TABLE_PRODUCTS_DESCRIPTION . " ORDER BY products_id LIMIT $offset, $step"

    3.

    Code
    while ($pID = xtc_db_fetch_array($pQuery))
        $pA[] = $pID['products_id'];


    OK. Das ist klar. Aber

    Code
    for ($k = 0; $k <= sizeof($pA); $k++)
        $pHash[] = array('pid' => $pA[$k]);


    ist Murks. $pHash[] wird nur einmal verwendet und zwar da: $commerceSeo->createSeoDBTableProduct($i, $pHash[$i]['pid']);
    Was ist das? Ein Array befüllen, ins andere die Werte drüberschaufeln und das letzte nutzen. Könnte man nicht von Anfang an das erste nutzen? Speicherverschwendung, CPU-Zeitverschwendung und das Script tut so, als es was sehr wichtiges zu tun hätte.

    4. admin/includes/modules/cseo/commerce_seo_url.php, from line 156

    Code
    $selbstaufruf = '<script language="javascript" type="text/javascript">setTimeout("document.img_continue.submit()", 3000);</script>';


    Worauf warten wir drei Sekunden?

    5. Auf dem Frontend wird nur Zähler geändert. Um die Änderung davon anzuzeigen wird aber die komplette Seite übertragen. Ajax doch mal!

    4 Mal editiert, zuletzt von info@biketeile-service.de (10. November 2014 um 21:53) aus folgendem Grund: code beautify

  • inc/commerce_seo.inc_orig.php, from line 590
    createSeoDBTableProduct

    6.

    Code
    while ($productList = xtc_db_fetch_array($product_query)) {
        ...
        if ($useLanguageUrl) {
            $lang_query = xtc_db_fetch_array(xtDBquery("SELECT code FROM " . TABLE_LANGUAGES . " WHERE languages_id = '" . $productList['language_id'] . "'"));
        ...
    }


    Unnötige Abfrage wird pro Produkt pro Sprache durchgeführt. Die Sprachen bleiben während der SEO-Linkgenerierung konstant.

    7.

    Code
    $doppel_query = xtc_db_query("SELECT COUNT(products_name) AS counter  FROM " . TABLE_PRODUCTS_DESCRIPTION . " WHERE products_name='" . $productListname . "'");
    $doppel_id = xtc_db_fetch_array($doppel_query);
    if ($doppel_id['counter'] > 1) {


    Wenn es auf Anzahl größer eins verglichen wird, wozu MySql dazu zwingen, alle Treffer aufzuzählen? Es reicht doch nur die erste zwei finden:

    Code
    $doppel_query = xtc_db_query("SELECT products_id FROM " . TABLE_PRODUCTS_DESCRIPTION . " WHERE products_name='" . $productListname . "' LIMIT 2");
    if (xtc_db_num_rows($doppel_query, false) > 1) {

    8. line 364, getCategoryPathForProduct
    Der größte Zeitverlust geschieht in dieser Methode. Sie braucht das komplette Reengineering.

    Zahlen:
    Anzahl Produkten: 1921013
    Anzahl Sprachen: 2
    SEO-Modul Einstellungen:

    Sprachabhängige URLs
    ../de/.. | ../en/..
    True

    Kurze URLs?
    False

    Lange URL auf Kurze URL umleiten?
    True

    URL in Kleinbuchstaben?
    True

    SEO Suchwörter?
    False

    404 oder 410?
    True

    Doppelten Content vermeiden
    True

    Doppelte Namen vermeiden
    True

    Anzahl Produkten pro Durchlauf: 5000

    Nach dem beseitigen des "Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 72bytes)"-Fehlers (Ich musste Limit auf 4 GB hochsetzen), habe ich die Durchlauf-Ausführungszeit aufgenommen.
    Mittelwert: 254.72 Sek.
    Nach dem Reengineering anhand der Punkte 1 bis 8:
    Mittelwert: 11.07 Sek mit 256 MB Memory Limit.

  • Respekt :) So mag ich das, und das nenne ich auch Community. Ja, die SEO-URL wurde damals vom Nico erstellt und hat bisher nicht ganz so viel Optimierungen erhalten. Ich schaue es mir jetzt mal in Ruhe an und Danke für die Optimierungen.

    <p>Wir geben nur Anregungen und Hilfestellung auf Basis unserer Erfahrung, keine Rechtshilfe!<br>\m/('_')\m/</p>

  • Teste auch wen mehrere auch extra sprachen ( 3 ) und auch wirklich ein ( alle unterscheidliche auch den sprache) urlalias beim produkten eingesteld ist, was dan den setting "Doppelte Namen TRUE" vermeiden macht.

    Hier was es so dass den id.nr dan extra mal angehangt war beim produkturls

    Musste dieser setting bei UNS auf false haben, damals zu spät bemerkt und alle diese produkten umleiten mussen um es wider in ordnung zu bekommen!


    Habe ich mall beim bugs in forum gemeldet