eCommerce Entwickler Blog

Der Entwickler Blog enthält verschiede Lösungsansätze für Fehler und Bug aus dem eCommerce Umfeld. Hier berichten Entwickler über ihre Erfahrungen und teilen ihre Lösungswege.

Performance Probleme aufgrund der Funktion oxArticle::getStockCheckQuery()

In manchen Situation erhält mal beim Shopsystem OXID unerwartet einen Server Error 500 (Timeout), ohne das es irgendwelche signifikanten Änderungen an der Shopsoftware oder der Infrastruktur gemacht worden sind. I.d.R. ist der erste Schritt zur Fehlerbehebung ein Neustart des Servers und oft erhält man von seinem Hoster auch die Rückmeldung, dass der Server unter sehr hoher Last stand. Oft hilft dieser Lösungsansatz, aber was wenn dieser Fehler plötzlich laufend und in der Hochsaison auftritt? Kann es sein, dass Ihr OXID Shop unter dem Bug 0002423 (oxArticle::getStockCheckQuery()) leidet!? Wir zeigen Ihnen die Lösung.

/**
 * Returns part of sql query used in active snippet. If config
 * option "blUseStock" is TRUE checks if "oxstockflag != 2 or
 * ( oxstock + oxvarstock ) > 0". If config option "blVariantParentBuyable" 
 * is TRUE checks if product has variants, and if has - checks is
 * there at least one variant which is buyable. If config option
 * option "blUseTimeCheck" is TRUE additionally checks if variants
 * "oxactivefrom < current data < oxactiveto" 
 *
 * @param bool $blForceCoreTable force core table usage
 *
 * @return string
 */
public function getStockCheckQuery($blForceCoreTable = null)
{
    $myConfig = $this->getConfig();
    $sTable = $this->getViewName($blForceCoreTable);

    $sQ = "";

    //do not check for variants
    if ($myConfig->getConfigParam('blUseStock')) {
        $sQ = " and ( $sTable.oxstockflag != 2 or ( $sTable.oxstock + $sTable.oxvarstock ) > 0  ) ";
        //V #M513: When Parent article is not purchasable, it's visibility should be displayed in shop only if any of Variants is available.
        if (!$myConfig->getConfigParam('blVariantParentBuyable')) {
            $sTimeCheckQ = '';
            if ($myConfig->getConfigParam('blUseTimeCheck')) {
                $sDate = date('Y-m-d H:i:s', oxRegistry::get("oxUtilsDate")->getTime());
                $sTimeCheckQ = " or ( art.oxactivefrom < '$sDate' and art.oxactiveto > '$sDate' )";
            }
            $sQ = " $sQ and IF( $sTable.oxvarcount = 0, 1, ( select 1 from $sTable as art where art.oxparentid=$sTable.oxid and ( art.oxactive = 1 $sTimeCheckQ ) and ( art.oxstockflag != 2 or art.oxstock > 0 ) limit 1 ) ) ";
        }
    }

    return $sQ;
}

Weiter geht's

Credits:

Haben Sie Fragen, Wünsche oder Anregungen?
Dann können Sie uns über unser Kontaktformular kontaktieren.

Jetzt das Kontaktformular öffnen!

oder Sie erreichen uns unter der Telefonnummer: (040) 88 14 00 36