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

Partager cet article :
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Slashdot
  • Wikio FR
  • email
  • LinkedIn
  • Live
  • MySpace
  • Technorati
  • blogmarks
  • Print
  • RSS
  • Twitter
  • viadeo FR
  • Wikio

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