2012-04-02 2 views
0

Gibt es eine Möglichkeit, die Gesamtzahl der Abfragen, die auf einer einzelnen Seite ausgeführt werden, zu zählen und wie lange es dauerte, um diese Seite im Zend Framework zu generieren?Verfolgen Ladezeit und Gesamtzahl der Abfragen in Zend Framework

Wir möchten diese Informationen protokollieren, damit wir sehen können, wo wir Engpässe und Seiten haben, die eine große Menge an Ressourcen generieren müssen.

Danke,

+0

Diese Antwort auch für Sie von Interesse sein kann: http://stackoverflow.com/questions/9468922/zend-db-profiler-log-to-file/9471309#9471309 Es zeigt eine ' dispatchLoopShutdown-Plugin, das den 'Zend_Db_Profiler' verwendet, um Abfrageinformationen zu protokollieren. Ich füge '$ GLOBALS ['_ T0'] = microtime (true);' in meiner 'index.php' Datei hinzu, damit ich diese von' time() 'subtrahieren kann, um die Gesamtzeit zu erhalten. Ich verwende ähnlichen Code in meiner Anwendung, um Abfrage- und Seitengenerierungszeitstatistiken zu generieren, die in der Fußzeile angezeigt werden. In meinem Fall verwende ich '$ this-> getResponse() -> setBody()', um einen Platzhalter durch die tatsächlichen Statistiken zu ersetzen, die ich generiere. – drew010

Antwort

3

sicher, dass es ein Db Profilerstellungs-Werkzeug zur Verfügung, ist es Zend_Db_Profiler anrufen und Sie können herausfinden, wie es zu benutzen, indem die offizielle Dokumentation zu lesen hier: http://framework.zend.com/manual/en/zend.db.profiler.html#zend.db.profiler.using

Grundsätzlich Sie, so etwas zu tun haben:

$db = Zend_Db_Table::getDefaultAdapter(); 
$profiler = $db->getProfiler(); 
$totalTime = $profiler->getTotalElapsedSecs(); 
$queryCount = $profiler->getTotalNumQueries(); 

Wie für die gesamte Ladezeit Ihrer Seite, wenn Sie nicht Layout (s) verwenden, dann ist es besser, eine Basis-Controller-Klasse zu erstellen, die die aktuelle (Mikro-) Zeit während Predispatch und PostDispatch-Methoden erhält Es ist die Basisklasse für alle Ihre Controller. Vielleicht so etwas wie dieses kann die Arbeit machen:

class Myapp_Controller_Action extends Zend_Controller_Action 
{ 
    protected $_startTime; 
    protected $_endTime; 
    protected $_totalTime; 

    public function preDispatch() 
    { 
    parent::preDispatch(); 
    $this->_startTime = microtime(true); 
    } 

    public function postDispatch() 
    { 
    parent::postDispatch(); 
    $this->_endTime = microtime(true); 
    $this->_totalTime = $this->_endTime - $this->_startTime; 
    // do something with $this->_totalTime; 
    } 
} 

und jeder Controller in Ihrer Anwendung sollte Myapp_Controller_Action statt Zend_Controller_Action erweitern:

class IndexController extends Myapp_Controller_Action 
{ 
    ... 
} 
0

die Abfragen sehen Sie den Profiler Ihrer Datenbankadapter aktivieren. Um dies zu tun, müssen Sie die folgende Zeile schreiben, die am Anfang Ihrer Software sein sollte:

$Db->getProfiler()->setEnabled(TRUE); 

Natürlich $Db sollte eine Instanz des Datenbank-Adapter sein. Um alle Fragen zu erhalten, die Sie tun können:

$Db->getProfiler()->getQueryProfiles() 

Natürlich können Sie mehr über Profiler aus dem offiziellen Dokument lesen.

0

Sie können die Pre- und Post-Versand-Hooks für ein Plug-in verwenden und die Zeitstempel in einer DB-Tabelle protokollieren. Bei der Post können Sie den entsprechenden Vorversandstempel suchen und die Gesamtsumme berechnen.

Bei Abfragen ist es wahrscheinlich am einfachsten, einen Wrapper zu dem, was Sie zum Erstellen der Abfragen verwenden, hinzuzufügen und bei jedem Aufruf der Abfrage-Methode einen statischen Zähler für die Wrapper-Klasse zu inkrementieren. Im Post-Versand-Hook könnten Sie dies auch in der DB protokollieren. Pre/Post-Dispatch Hooks zu klagen, schauen http://devzone.zend.com/1224/front-controller-plugins-in-zend-framework/

Viel Glück

Für Plugins zu schreiben.

2

Zusätzlich ist hier eine Beratung für das Debuggen. Natürlich wird es nicht für das Protokollieren gelten. Sie können Zend_Db_Profiler + Firebug + FirePHP mit Firefox benutzen, die wirklich wirklich schön zusammen: Die Konfiguration sollte sein (ini-Format Ich verwende, kann aber durch Code oder XML angepasst werden):

database.params.profiler.enabled = true 
database.params.profiler.class = Zend_Db_Profiler_Firebug 

Sie‘ lch bekomme diese Art von Ergebnis: Gesamtzeit in Ihrer Datenbank (en) + Abfragedetails und verbrachte Zeit (und optionale Parameter). Große Werkzeuge jeden Tag benutzen!

enter image description here