2010-03-01 5 views
0

Suite à l'exemple de code sur http://framework.zend.com/manual/en/zend.db.profiler.html j'ai mis en place le profilage db de mon application Zend Framework.Zend_Db_Profiler ne consigne pas le temps de connexion db?

application.ini:

db.profiler.enabled = true 

Voir Helper:

$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"; 

Il fonctionne très bien pour sélectionner/insertion/mise à jour/supprimer des requêtes.

Mais je n'arrive pas à trouver de toute façon que le profileur affiche le temps nécessaire pour lancer la connexion db réelle, malgré la documentation qui implique qu'il l'enregistre.

Je soupçonne que Zend_Db ne connecte simplement pas la connexion à la base de données avec le profileur.

Est-ce que quelqu'un sait ce qui se passe ici?

J'utilise l'adaptateur de base de données Oracle et ZF 1.10.1

MISE À JOUR:

Je comprends qu'il est possible de filtrer la sortie de profileur, de telle sorte qu'il ne montrera que certaines requêtes types, par exemple sélectionner/insérer/mettre à jour. Il semble également être une option pour filtrer uniquement les enregistrements de connexion:

$profiler->setFilterQueryType(Zend_Db_Profiler::CONNECT); 

Cependant, mon problème est que le profileur ne se connecte pas les connexions pour commencer, donc ce filtre ne fait rien.

Je sais que cela pour un fait, parce que si j'imprimer l'objet profileur, il contient des données pour de nombreuses requêtes - mais pas de données pour les requêtes de connexion:

print_r($profiler); 
 
//output 
Zend_Db_Profiler Object 
(
    [_queryProfiles:protected] => Array 
     (
      [0] => Zend_Db_Profiler_Query Object 
       (
        [_query:protected] => select * from table1 
        [_queryType:protected] => 32 
        [_startedMicrotime:protected] => 1268104035.3465 
        [_endedMicrotime:protected] => 1268104035.3855 
        [_boundParams:protected] => Array 
         (
         ) 

       ) 

      [1] => Zend_Db_Profiler_Query Object 
       (
        [_query:protected] => select * from table2 
        [_queryType:protected] => 32 
        [_startedMicrotime:protected] => 1268104035.3882 
        [_endedMicrotime:protected] => 1268104035.419 
        [_boundParams:protected] => Array 
         (
         ) 

       ) 

     ) 

    [_enabled:protected] => 1 
    [_filterElapsedSecs:protected] => 
    [_filterTypes:protected] => 
) 

Est-ce que je fais quelque chose de mal - ou la journalisation des connexions n'a-t-elle pas encore été ajoutée à Zend Framework?

Répondre

0

La connexion 'bundles' du profileur et d'autres opérations dans les requêtes générales.

Il y a trois façons dont vous pouvez examiner le lien spécifique:

  1. Définir un filtre sur le profileur lors de l'installation:

    $profiler->setFilterQueryType(**Zend_Db_Profiler::CONNECT**); 
    

    ensuite les profils résultants ne comprendra « se connecter 'opérations.

  2. Spécifiez un type de requête lorsque vous récupérez les profils de requête:

    $profiles = $profiler->getQueryProfiles(**Zend_Db_Profiler::CONNECT**); 
    
  3. Examinez les objets requête directement lors de l'itération:

    foreach($profiler->getQueryProfiles() as $query) { 
    if ($query->getQueryType() == Zend_Db_Profiler::CONNECT && 
        $query->getElapsedSecs() > $longestConnectionTime) { 
         $longestConnectionTime = $query->getElapsedSecs(); 
        } 
    } 
    

Vous ne trouverez pas beaucoup de détails là-dedans, il est enregistré comme une opération de «connexion» avec le temps pris.

+0

C'est mon problème cependant - cela ne fonctionne pas pour moi! Aucun enregistrement de connexion n'est enregistré, il n'y a donc rien à filtrer. Je vais essayer de mettre à jour ma question pour donner plus d'informations à ce sujet. – asgeo1

+1

Il semble que l'adaptateur Oracle ne fait pas les appels pertinents au profileur pour la connexion. En comparant les méthodes _connect() dans Zend_Db_Adapter_Pdo_Abstract et Zend_Db_Adapter_Oracle, avant de créer la connexion, l'ancien appelle: $ q = $ this -> _ profiler-> queryStart ('connect', Zend_Db_Profiler :: CONNECT); et par la suite: $ this -> _ profiler-> queryEnd ($ q); L'adaptateur Oracle n'a aucune référence au profileur (jusqu'à la version 1.10.2 au moins), mais j'imagine que cela pourrait être aussi simple que d'ajouter des appels équivalents dans la méthode _connect(). –