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
Commentaires récents