Comment enregistrer tous les Magento SQL?

23

Existe-t-il un moyen simple de consigner toutes les requêtes exécutées par Magento?

Le but est d'imprimer tout le SQL exécuté, par exemple lors du chargement de la page

Fra
la source

Réponses:

43

Si vous voulez être sûr que tout SQL est réellement connecté, je vous suggère d'utiliser un logiciel tiers:

  • Neon Profile SQL est en fait gratuit et fonctionne bien
    (vous devez modifier local.xml pour attacher Magento à Neon ... cela fonctionne comme une sorte de proxy SQL enregistrant tout ce qui le traverse)

En variante, une approche native Magento / Varien pourrait être la suivante:

  1. modifier lib/Varien/Db/Adapter/Pdo/Mysql.php
  2. changez les propriétés suivantes en true(ligne 103)
  3. vous aurez un fichier journal à créer ici var/debug/pdo_mysql.log

Voici la ligne à changer: (les commentaires sont explicites)

 /**
     * Write SQL debug data to file
     *
     * @var bool
     */
    protected $_debug               = true;

    /**
     * Minimum query duration time to be logged
     *
     * @var float
     */
    protected $_logQueryTime        = 0.05;

    /**
     * Log all queries (ignored minimum query duration time)
     *
     * @var bool
     */
    protected $_logAllQueries       = true;

    /**
     * Add to log call stack data (backtrace)
     *
     * @var bool
     */
    protected $_logCallStack        = true;

Le journal produit est comme le suivant:

## 2014-06-26 12:18:47
## 10258 ## QUERY
SQL: SELECT `adminnotification_inbox`.* FROM `adminnotification_inbox` WHERE (title = 'Customize your order and invoice numbers to protect your sales using Order Number Customizer by XTENTO.') AND (url = 'http://www.xtento.com/magento-extensions/order-number-customizer.html?utm_source=feed&utm_medium=feed&utm_campaign=order_number_customizer')
AFF: 1
TIME: 0.0008

Dans le cas où vous l'avez activé, $_logCallStackvous aurez également un parte TRACE

TRACE: #1 Varien_Db_Adapter_Pdo_Mysql#00000000644036ff00007f14137095e6#->_debugStat(2, 'SELECT `adminnot...', array(), &Varien_Db_Statement_Pdo_Mysql#000000006440371700007f14137095e6#) called at [lib/Varien/Db/Adapter/Pdo/Mysql.php:424]
#2 Varien_Db_Adapter_Pdo_Mysql#00000000644036ff00007f14137095e6#->query(&Varien_Db_Select#000000006440371800007f14137095e6#, array()) called at [lib/Zend/Db/Adapter/Abstract.php:753]
#3 Varien_Db_Adapter_Pdo_Mysql[Zend_Db_Adapter_Abstract]#00000000644036ff00007f14137095e6#->fetchRow(&Varien_Db_Select#000000006440371800007f14137095e6#) called at [app/code/core/Mage/AdminNotification/Model/Resource/Inbox.php:116]
#4 Mage_AdminNotification_Model_Resource_Inbox#00000000644034c500007f14137095e6#->parse(&Mage_AdminNotification_Model_Inbox#00000000644034e900007f14137095e6#, array(array('severity' => 4, 'date_added' => '2013-10-23 13:00...', 'title' => 'Customizing your...', 'description' => 'Easily add new c...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-04-09 17:00...', 'title' => 'Customize your o...', 'description' => 'Customize your M...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-05-06 17:00...', 'title' => 'Process orders i...', 'description' => 'Process all your...', 'url' => 'http://www.xtent...'))) called at [app/code/core/Mage/AdminNotification/Model/Inbox.php:118]
#5 Mage_AdminNotification_Model_Inbox#00000000644034e900007f14137095e6#->parse(array(array('severity' => 4, 'date_added' => '2013-10-23 13:00...', 'title' => 'Customizing your...', 'description' => 'Easily add new c...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-04-09 17:00...', 'title' => 'Customize your o...', 'description' => 'Customize your M...', 'url' => 'http://www.xtent...'), array('severity' => 4, 'date_added' => '2014-05-06 17:00...', 'title' => 'Process orders i...', 'description' => 'Process all your...', 'url' => 'http://www.xtent...'))) called at [app/code/local/Xtento/XtCore/Model/Feed.php:57]
#6 Xtento_XtCore_Model_Feed#000000006440348500007f14137095e6#->checkUpdate(&Varien_Event_Observer#00000000644034d900007f14137095e6#) called at [app/code/core/Mage/Core/Model/App.php:1338]
#7 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->_callObserverMethod(&Xtento_XtCore_Model_Feed#000000006440348500007f14137095e6#, 'checkUpdate', &Varien_Event_Observer#00000000644034d900007f14137095e6#) called at [app/code/core/Mage/Core/Model/App.php:1317]
#8 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->dispatchEvent('controller_actio...', array('controller_actio...' => &Fishpig_Wordpress_Adminhtml_WordpressController#000000006440364a00007f14137095e6#)) called at [app/Mage.php:451]
#9 Mage::dispatchEvent('controller_actio...', array('controller_actio...' => &Fishpig_Wordpress_Adminhtml_WordpressController#000000006440364a00007f14137095e6#)) called at [app/code/core/Mage/Core/Controller/Varien/Action.php:528]
#10 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Core_Controller_Varien_Action]#000000006440364a00007f14137095e6#->preDispatch() called at [app/code/core/Mage/Adminhtml/Controller/Action.php:160]
#11 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Adminhtml_Controller_Action]#000000006440364a00007f14137095e6#->preDispatch() called at [app/code/core/Mage/Core/Controller/Varien/Action.php:408]
#12 Fishpig_Wordpress_Adminhtml_WordpressController[Mage_Core_Controller_Varien_Action]#000000006440364a00007f14137095e6#->dispatch('checkVersion') called at [app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:250]
#13 Mage_Core_Controller_Varien_Router_Admin[Mage_Core_Controller_Varien_Router_Standard]#00000000644036ae00007f14137095e6#->match(&Mage_Core_Controller_Request_Http#000000006440365c00007f14137095e6#) called at [app/code/core/Mage/Core/Controller/Varien/Front.php:176]
#14 Mage_Core_Controller_Varien_Front#000000006440365700007f14137095e6#->dispatch() called at [app/code/core/Mage/Core/Model/App.php:354]
#15 Mage_Core_Model_App#00000000644036ef00007f14137095e6#->run(array('scope_code' => '', 'scope_type' => 'store', 'options' => array())) called at [app/Mage.php:687]
#16 Mage::run('', 'store') called at [index.php:87]
Fra
la source
15

Activez le Zend SQL Profiler avec le nœud suivant dans votre app/etc/local.xml

<resources>
 <default_setup>
  <connection>
   <profiler>1</profiler>

Ensuite, vous pouvez accéder au profileur quelque part dans votre code et récupérer de nombreuses informations sur toutes les requêtes exécutées:

$profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();

Pour simplement afficher toutes les requêtes:

print_r($profiler->getQueryProfiles());

Vous pouvez ajouter ces deux lignes à la fin de index.phppour voir toutes les requêtes au bas de chaque page. Sachez que cela interrompra les requêtes AJAX qui renvoient une réponse JSON, vous pouvez donc envisager de consigner les requêtes au lieu de les imprimer, avec ce code (encore une fois, ajoutez-le à la fin de index.php):

$profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();
Mage::log(print_r($profiler->getQueryProfiles(), true), null, 'queries.log', true);

Ensuite, vous trouverez toutes les requêtes dans var/log/queries.log

N'oubliez pas de supprimer à nouveau les lignes une fois le débogage terminé!

Fabian Schmengler
la source
2

Je ne suis pas sûr à 100% que cela interceptera toutes les requêtes, mais la plupart exécutent la méthode de requête Zend_Db_Adapter_Abstract dans

lib / Zend / Db / Adapter / Abstract.php

Dans cet esprit, vous pouvez ajouter temporairement des instructions de débogage (à une copie que vous faites dans

app / code / local / Mage

pour être sûr)

public function query($sql, $bind = array())
{
    // connect to the database if needed
    $this->_connect();

    // is the $sql a Zend_Db_Select object?
    if ($sql instanceof Zend_Db_Select) {
        if (empty($bind)) {
            $bind = $sql->getBind();
        }

        $sql = $sql->assemble();
    }
    echo '$sql' . "\n<br />\n";
    var_dump($bind);
TBI Infotech
la source
2
Je pense que j'ai utilisé une approche similaire une fois mais j'ai trouvé plus agréable la méthode suggérée par moi :)
Fra
msgstr "ajouter temporairement quelques instructions de débogage pour être sûr". Il n'y a rien de sûr dans cette approche.
Kevin Schroeder
2

Si vous avez accès au serveur mysql et que vous n'avez pas d'autres projets qui exécutent des requêtes, vous pouvez essayer d'ajouter le journal général de mysql. Regardez ici comment faire cela /programming/6479107/how-to-enable-mysql-query-log car il écrit toutes les requêtes que le fichier journal peut grossir très rapidement, alors assurez-vous de tourner éteignez-le après que vous en ayez fini.

Emi
la source