juil 28

Un backoffice Magento lent à charger


Il existe deux ou trois cas différents au moins où le backoffice de Magento peut être très lent à charger. En 0.9.6 il manquait un index dans une table, en 1.1.6 il y avait un autre soucis et nous sommes tombés récemment sur un os en version 1.2, 1.3 et +.

Le bug est lié aux règles qui sont implémentées dans le catalogue. Avoir une règle spécifique , par exemple une réduction sur une catégorie, peut rendre le chargement du backoffice très lent. (horriblement lent en fait)

Rappelons en plus que le Flat Catalog, qui améliore les performances (d’environ 20% sur une 1.3), ne s’applique qu’au front, le backoffice lui est toujours obligé d’utiliser le modèle EAV.

D’habitude Wikigento ne touche que rarement au code sauf pour des raisons de performances ou de sécurité mais ici la nuance est assez fine vu qu’il s’agit bien d’optimiser les performances de Magento mais en patchant le code… Bref, on l’a donc on le diffuse !

Référence du Bug


NBS System a déclaré ce bug à Varien pour plusieurs de ses clients. Il est probable que d’autres magasins, hébergeurs, développeurs aient le problème, voici donc ce patch, en attendant que ceci soit intégré au code source de Magento (ce qui n’est pas le cas pour le moment)

Le bug est référencé sous le numéro et la description suivante chez Varien :
[#VQR-617032] : « Catalog price rules problem »

Il semble que ce patch améliore un peu les choses sans tout résoudre cependant.  (Nous réouvrirons le ticket si les performances ne sont pas  suffisantes)

Patcher son Magento


Attention, ce patch est conçu pour la version 1.2.1 de Magento.

Sur d’autres versions, vous aurez probablement à l’adapter. Plus précisément il est fait pour une version 0.13 de Mage_Weee (soit une révision N° 44593 des fichiers).

Il est assez simple à lire et à comprendre et donc à adapter. Cependant si vous l’adaptez pour une autre version ou si vous l’améliorez, vous devez le renvoyer à Varien (ou à moi, je le ferai parvenir à la bonne personne) puisque ce patch est en OSL 3. (Opensource Licence 3)

1°) Copiez le fichier sur le serveur (ftp ou scp) ou copier/coller le contenu de cette codebox dans un fichier :
cat > weee_discount_optimize_sm70_121.patch
CTRL+C sur la codebox puis boutonde droite de la souris dans un putty
CTRL+D dans le putty)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
Index: app/code/core/Mage/Weee/etc/config.xml
===================================================================
--- app/code/core/Mage/Weee/etc/config.xml	(revision 44593)
+++ app/code/core/Mage/Weee/etc/config.xml	(working copy)
@@ -28,7 +28,7 @@
 <config>
     <modules>
         <Mage_Weee>
-            <version>0.13</version>
+            <version>0.14</version>
         </Mage_Weee>
     </modules>
 
@@ -297,4 +297,4 @@
              </updates>
         </layout>
     </frontend>
-</config>
\ No newline at end of file
+</config>
Index: app/code/core/Mage/Weee/Model/Mysql4/Tax.php
===================================================================
--- app/code/core/Mage/Weee/Model/Mysql4/Tax.php	(revision 44593)
+++ app/code/core/Mage/Weee/Model/Mysql4/Tax.php	(working copy)
@@ -14,17 +14,44 @@
     {
         return $this->_getReadAdapter()->fetchCol($select);
     }
-
+
     public function updateDiscountPercents()
     {
-        $this->_getWriteAdapter()->delete($this->getTable('weee/discount'));
+		return $this->_updateDiscountPercents();
+    }
+
+    public function updateDiscountPercentsByPCondition($productCondition)
+    {
+    	return $this->_updateDiscountPercents($productCondition);
+    }
+
+    protected function _updateDiscountPercents($productCondition=null)
+    {
+        if (is_null($productCondition)) {
+            $this->_getWriteAdapter()->delete($this->getTable('weee/discount'));
+        } else {
+            $this->_getWriteAdapter()->delete($this->getTable('weee/discount'),
+                $this->_getReadAdapter()->quoteInto('entity_id in (?)',
+                    $this->_getReadAdapter()->fetchCol($productCondition->getIdsSelect($this->_getReadAdapter()))
+                )
+            );
+        }
+
         $now = strtotime(now());
 
         $select = $this->_getReadAdapter()->select();
-        $select->from(array('data'=>$this->getTable('catalogrule/rule_product')))
-            ->where('(from_time <= ? OR from_time = 0)', $now) -            ->where('(to_time >= ? OR to_time = 0)', $now)
-            ->order(array('data.website_id', 'data.customer_group_id', 'data.product_id', 'data.sort_order'));
+        $select->from(array('data'=>$this->getTable('catalogrule/rule_product')));
+
+        if (is_null($productCondition)) {
+            $select->where('(from_time <= ? OR from_time = 0)', $now); +            $select->where('(to_time >= ? OR to_time = 0)', $now);
+        } else {
+            $select->where('product_id in (?)',
+                $this->_getReadAdapter()->fetchCol($productCondition->getIdsSelect($this->_getReadAdapter()))
+            );
+        }
+
+        $select->order(array('data.website_id', 'data.customer_group_id', 'data.product_id', 'data.sort_order'));
 
         $data = $this->_getReadAdapter()->fetchAll($select);
         $productData = array();
@@ -68,4 +95,4 @@
 
         return $this->_getReadAdapter()->fetchOne($select);
     }
-}
\ No newline at end of file
+}
Index: app/code/core/Mage/Weee/Model/Observer.php
===================================================================
--- app/code/core/Mage/Weee/Model/Observer.php	(revision 44593)
+++ app/code/core/Mage/Weee/Model/Observer.php	(working copy)
@@ -195,7 +195,13 @@
 
     public function updateDiscountPercents(Varien_Event_Observer $observer)
     {
-        Mage::getModel('weee/tax')->updateDiscountPercents();
+    	if ( $observer->getEvent()->getProductCondition() ) {
+        	Mage::getModel('weee/tax')->updateDiscountPercentsByPCondition(
+        	   $observer->getEvent()->getProductCondition()
+        	);
+    	} else {
+    		Mage::getModel('weee/tax')->updateDiscountPercents();
+    	}
         return $this;
     }
 
@@ -252,4 +258,4 @@
 
         return $this;
     }
-}
\ No newline at end of file
+}
Index: app/code/core/Mage/Weee/Model/Tax.php
===================================================================
--- app/code/core/Mage/Weee/Model/Tax.php	(revision 44593)
+++ app/code/core/Mage/Weee/Model/Tax.php	(working copy)
@@ -152,6 +152,12 @@
         }
     }
 
+    public function updateDiscountPercentsByPCondition($productCondition)
+    {
+    	$this->getResource()->updateDiscountPercentsByPCondition($productCondition);
+    	return $this;
+    }
+
     public function updateDiscountPercents()
     {
         $this->getResource()->updateDiscountPercents();
Index: app/code/core/Mage/Weee/sql/weee_setup/mysql4-upgrade-0.13-0.14.php
===================================================================
--- app/code/core/Mage/Weee/sql/weee_setup/mysql4-upgrade-0.13-0.14.php	(revision 0)
+++ app/code/core/Mage/Weee/sql/weee_setup/mysql4-upgrade-0.13-0.14.php	(revision 0)
@@ -0,0 +1,31 @@
+<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category   Mage + * @package    Mage_Weee + * @copyright  Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com) + * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0) + */ + +$installer = $this; +/* @var $installer Mage_Weee_Model_Mysql4_Setup */ + +$installer->getConnection()->modifyColumn($installer->getTable('weee/discount'), 'customer_group_id', 'SMALLINT(5) UNSIGNED DEFAULT NULL');
+$installer->getConnection()->modifyColumn($installer->getTable('weee/discount'), 'website_id', 'SMALLINT(5) UNSIGNED DEFAULT NULL');



2°) Loggez vous  sur le système en SSH

3°) Backupez votre fichiers
app/code/core/Mage/Weee/etc/config.xml
app/code/core/Mage/Weee/Model/Mysql4/Tax.php
app/code/core/Mage/Weee/Model/Observer.php
app/code/core/Mage/Weee/Model/Tax.php
app/code/core/Mage/Weee/sql/weee_setup/mysql4-upgrade-0.13-0.14.php

4°) Lancez la commande « patch p-0 < weee_discount_optimize_sm70_121.patch« 
5°) Priez
6°) Testez

if (patch == « good ») {Send(flower->Wikigento)} else {Send(insults->Varien)} endif

écrit par Philippe Humeau \\ tags: , , ,


2 commentaires sur “Correctif pour certaines lenteurs du backoffice Magento”

  1. 1. Jérôme Dit :

    Le problème sera t’il résolu par Varien sur la 1.4 ?

  2. 2. Philippe Humeau Dit :

    J’espère bien, beaucoup (trop) de bugs restent en souffrance et pas mis à jour… Notamment en sécurité on a remonté une faille en novembre 2009, personne n’a rien releasé. J’espère beaucoup de la 1.4, comme toute la communauté. On a râlé avec Gabriel lors du CAB meeting #4 en disant que c’était un peu abusé de passer 3 releases de la EE et 0 de la CE. On a eu droit à « début janvier promis » et fin janvier la 1.4 est toujours en Béta. Sur le CAB de février, ca va être beaucoup plus cash je pense.

    On a besoin de fix, d’optimisations, de correctifs de sécurité et de suivi sur la CE et ca commence à tarder là… J’ai été dans les premiers à monter au créneau pour défendre Varien lors de son passage à un modèle commercial, il se trouve qu’il est mauvais mais bon, ils ont besoin d’argent par contre ca ne devait pas ralentir la CE et là, on y est pas.

Poster une réponse