Exécution de la fonction getConfig


12

J'ai mesuré le temps d'exécution de ma page et j'ai remarqué que la fonction getBaseCurrencyCode () prend plus d'une seconde à s'exécuter. Toute ma mise en cache est activée.

J'ai examiné la fonction et j'ai vu que la commande suivante:

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

prend plus d'une seconde.

mais quand j'utilise Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); ça prend des millisecondes

quelqu'un peut-il me dire pourquoi ce décalage horaire se produit?

aucun conseil?


Bien que j'aie essayé les solutions suggérées que vous avez proposées, il y a toujours des écarts de temps énormes. Je serais heureux si vous pouvez essayer de mesurer le temps qu'il vous faut pour exécuter la fonction getConfig et la publier ici.

J'ai essayé de mesurer le temps que prend cette fonction en enveloppant ce code avec des fonctions microtime

c'est-à-dire sur le chemin local: app\code\core\Mage\Core\Model au lieu de cette ligne:

$configValue = $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE);

Je l'ai remplacé par ce code (même code avec microtime):

$start = microtime(true);

$configValue = $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE);

$time_elapsed_secs = microtime(true) - $start;

echo "function: getConfig() took me: " .  $time_elapsed_secs . " sec<br />";

die;

ma sortie était:

function: getConfig() took me: 1.1326711177826 sec

Je serais heureux de voir votre sortie et votre runtime.

Réponses:


4

Il y a de petites différences dans l'analyse de la configuration entre les 2 mais celles-ci ne devraient pas affecter les performances. Les deux méthodes passent simplement par un grand tableau pour récupérer des données.
getConfigfait en fait quelques calculs simples, puis appelle getNode.
La seule grande différence que je vois est que $this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)appelle ceci: $this->_processConfigValue($fullPath, $path, $data);.
Cette partie traite les directives marquées avec {{...}}et à un moment donné la méthode s'appelle elle-même dans certaines circonstances.
Essayez de comparer les 2 après avoir supprimé l' _processConfigValueappel.


3

Quand vous appelez

$this->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Il appellera

 public function getConfig($path)
    {
        if (isset($this->_configCache[$path])) {
            return $this->_configCache[$path];
        }

        $config = Mage::getConfig();

        $fullPath = 'stores/' . $this->getCode() . '/' . $path;
        $data = $config->getNode($fullPath);
        if (!$data && !Mage::isInstalled()) {
            $data = $config->getNode('default/' . $path);
        }
        if (!$data) {
            return null;
        }
        return $this->_processConfigValue($fullPath, $path, $data);
    }

aussi

protected function _processConfigValue($fullPath, $path, $node)
    {
        if (isset($this->_configCache[$path])) {
            return $this->_configCache[$path];
        }

        if ($node->hasChildren()) {
            $aValue = array();
            foreach ($node->children() as $k => $v) {
                $aValue[$k] = $this->_processConfigValue($fullPath . '/' . $k, $path . '/' . $k, $v);
            }
            $this->_configCache[$path] = $aValue;
            return $aValue;
        }

        $sValue = (string) $node;
        if (!empty($node['backend_model']) && !empty($sValue)) {
            $backend = Mage::getModel((string) $node['backend_model']);
            $backend->setPath($path)->setValue($sValue)->afterLoad();
            $sValue = $backend->getValue();
        }

        if (is_string($sValue) && strpos($sValue, '{{') !== false) {
            if (strpos($sValue, '{{unsecure_base_url}}') !== false) {
                $unsecureBaseUrl = $this->getConfig(self::XML_PATH_UNSECURE_BASE_URL);
                $sValue = str_replace('{{unsecure_base_url}}', $unsecureBaseUrl, $sValue);
            } elseif (strpos($sValue, '{{secure_base_url}}') !== false) {
                $secureBaseUrl = $this->getConfig(self::XML_PATH_SECURE_BASE_URL);
                $sValue = str_replace('{{secure_base_url}}', $secureBaseUrl, $sValue);
            } elseif (strpos($sValue, '{{base_url}}') !== false) {
                $sValue = Mage::getConfig()->substDistroServerVars($sValue);
            }
        }

        $this->_configCache[$path] = $sValue;

        return $sValue;
    }

et quand tu appelles

Mage::getConfig()->getNode(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE)

Il lira le xmlfichier et retournera la sortie.

Je pense que selon @Marius monsieur le suggère et cela n'affectera pas les performances.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.