Zend_Db_Profiler kann aktiviert werden, um das Erstellen von Profilen für 
            Abfragen zu erlauben. Die Profile enthalten die Abfragen, die durch den Adapter 
            verarbeitet worden sind, sowie die Laufzeit der Abfragen, um die Kontrolle der 
            verarbeiteten Abfragen zu ermöglichen, ohne das extra Code für das Debugging zu den 
            Klassen hinzugefügt werden muß. Die erweiterte Verwendung ermöglicht den Entwickler 
            sogar zu filtern, welche Abfragen aufgezeichnet werden sollen.  
        
Der Profiler wird entweder durch die Übergabe eines Parameters an den Konstruktor des Adapters oder zu einem späteren Zeitpunkt direkt an den Adapter aktiviert.
<?php
require_once 'Zend/Db.php';
$params = array (
    'host'     => '127.0.0.1',
    'username' => 'malory',
    'password' => '******',
    'dbname'   => 'camelot',
    'profiler' => true  // aktiviere den Profiler; false, um ihn zu deaktivieren (Standard)
);
$db = Zend_Db::factory('PDO_MYSQL', $params);
// deaktiviere Profiler
$db->getProfiler()->setEnabled(false);
// aktiviere Profiler
$db->getProfiler()->setEnabled(true);
?>
            Der Profiler kann jederzeit über die Adapter Methode getProfiler() geholt
            werden:
        
<?php $profiler = $db->getProfiler(); ?>
            Dies gibt eine Zend_Db_Profiler Objektinstanz zurück. Mit dieser Instanz
            kann der Entwickler seine Abfragen mit Hilfe von verschiedenen Methoden untersuchen:
        
                    getTotalNumQueries() gibt die Gesamtzeit aller aufgezeichneten 
                    Abfragen zurück.
                
                    getTotalElapsedSecs() gibt die gesamte Anzahl an Sekunden 
                    für alle aufgezeichneten Abfragen zurück.
                
                    getQueryProfiles() gibt ein Array mit allen aufgezeichneten
                    Abfragen zurück.
                
                    getLastQueryProfile() gibt das Profil der letzten (neuesten) 
                    Abfrage zurück, gleichgültig ob die Abfrage beendet werden konnte oder nicht (wenn
                    nicht, wird die Endzeit null sein)
                
                    clear() löscht jedes vorherige Abfrageprofile vom Stapel.
                
            Der Rückgabewert von getLastQueryProfile() und die einzelnen Elemente von 
            getQueryProfiles() sind Zend_Db_Profiler_Query Objekte, welche
            die Möglichkeit bieten, die individuellen Abfragen zu untersuchen:
        
                    getQuery() gibt den SQL Text der Abfrage zurück.
                
                    getElapsedSecs() gibt die Anzahl der Sekunden zurück, wie lange
                    die Abfrage gelaufen ist.
                
            Die Informationen, die Zend_Db_Profiler bereitstellt, sind nützlich, um 
            Engpässe in der Anwendung zu ermitteln und um Abfragen zu überprüfen, die durchgeführt
            worden sind. Um zum Beispiel die genaue Abfrage zu sehen, die zuletzt durchgeführt 
            worden ist:
        
<?php $query = $profiler->getLastQueryProfile(); echo $query->getQuery(); ?>
Vielleicht wird eine Seite langsam erstellt; verwende den Profiler, um zuerst die gesamte Laufzeit aller Abfragen zu ermitteln und dann durchlaufe die Abfragen, um die am längsten laufende zu finden:
<?php
$totalTime    = $profiler->getTotalElapsedSecs();
$queryCount   = $profiler->getTotalNumQueries();
$longestTime  = 0;
$longestQuery = null;
foreach ($profiler->getQueryProfiles() as $query) {
    if ($query->getElapsedSecs() > $longestTime) {
        $longestTime  = $query->getElapsedSecs();
        $longestQuery = $query->getQuery();
    }
}
echo 'Executed ' . $queryCount . ' queries in ' . $totalTime . ' seconds' . "\n";
echo 'Average query length: ' . $totalTime / $queryCount . ' seconds' . "\n";
echo 'Queries per second: ' . $queryCount / $totalTime . "\n";
echo 'Longest query length: ' . $longestTime . "\n";
echo "Longest query: \n" . $longestQuery . "\n";
?>
            Zusätzlich zum Untersuchen von Anfragen erlaubt der Profiler dem Entwickler auch zu 
            filtern, welche Abfragen aufgezeichnet werden sollen. Die folgenden Methoden arbeiten 
            mit einer Zend_Db_Profiler Instanz:
        
                setFilterElapsedSecs() ermöglicht dem Entwickler, einen minimale 
                Laufzeit anzugeben, bevor eine Abfrage aufzeichnet werden soll. Um den Filter zu
                entfernen, muss nur der Wert null an die Methode übergeben werden.
            
<?php // Zeichne nur Abfragen auf, die mindestens 5 Sekunden laufen: $profiler->setFilterElapsedSecs(5); // Zeichne alle Abfragen unabhängig von deren Laufzeit auf: $profiler->setFilterElapsedSecs(null); ?>
                setFilterQueryType() ermöglicht dem Entwickler anzugeben, welche 
                Abfragetypen aufgezeichnet werden sollen; um mehrere Typen aufzuzeichnen, verwende
                das logische OR. Abfragetypen sind mit den folgenden 
                Zend_Db_Profiler Konstanten definiert:
            
                        Zend_Db_Profiler::CONNECT: Verbindungsoperationen oder 
                        Auswahl einer Datenbank .
                    
                        Zend_Db_Profiler::QUERY: allgemeine Datenbankabfragen, die
                        keinem der anderen Typen entsprechen.
                    
                        Zend_Db_Profiler::INSERT: jede Abfrage, die neue Daten zur
                        Datenbank hinzufügt, normalerweise ein SQL INSERT.
                    
                        Zend_Db_Profiler::UPDATE: jede Abfrage, die vorhandene Daten
                        aktualisiert, normalerweise ein SQL UPDATE.
                    
                        Zend_Db_Profiler::DELETE: jede Abfrage, die vorhandene Daten
                        löscht, normalerweise ein SQL DELETE.
                    
                        Zend_Db_Profiler::SELECT: jede Abfrage, die vorhandene Daten
                        selektiert, normalerweise ein SQL SELECT.
                    
                        Zend_Db_Profiler::TRANSACTION: jede Transaktionsoperation,
                        wie zum Beispiel START TRANSACTION, COMMIT oder ROLLBACK.
                    
                Mit setFilterElapsedSecs() kannst du jeden vorhandenen Filtern 
                entfernen, indem du null als einziges Argument übergibst.
            
<?php // zeichne nur SELECT Abfragen auf $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT); // zeichne SELECT, INSERT und UPDATE Abfragen auf $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE); // zeichne DELETE Abfragen auf (damit wir herausfinden, warum Daten verloren gehen) $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE); // Remove all filters $profiler->setFilterQueryType(null); ?>
                Die Verwendung von setFilterQueryType() kann die Anzahl der 
                aufgezeichneten Abfragen reduzieren. Allerdings kann es sinnvoller sein, alle
                Abfragen auzuzeichnen, baer nur diese anzuschauen, die im Moment gebraucht werden. 
                Ein weiteres Feature von getQueryProfiles() ist das Filtern der 
                Abfragen "on-the-fly" durch Übergabe eines Abfragetyps (oder eine logischen 
                Kombination von Abfragetypen) als erstes Argument; beachte 
                Abschnitt 9.3.3.2, „Filtern anhand des Abfragetyp“ für eine Liste der 
                Konstanten für Abfragetypen.
            
<?php // Hole nur SELECT Abfragen zurück $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT); // Hole nur SELECT, INSERT un UPDATE Abfragen zurück $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE); // Hole DELETE Abfragen zuürck (damit wir herausfinden, warum Daten verloren gehen) $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE); ?>