incubator-zeta-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gaetano Giunta <giunta.gaet...@gmail.com>
Subject Re: [zeta-dev] Profiler for db component
Date Sun, 29 Aug 2010 12:16:04 GMT
  Andreas Schamberger wrote:
> Hi,
>
> I already posted this a year ago on the old ezc mailing list. There was no feedback.
So I'll start another attempt here ...
>
> I was annoyed by not being able to analyze my query execution times. What I want is a
profiler that transparently collects the data without adding anything to 
> my code base. My solution: A new ezcDbHandler implementation as a proxy for the real
db handler instance. The new db handler configures a custom PDOStatement 
> that collects the profiling information and a backtrace of the query.
>
> I also added the ability to get a prepared SQL string by caching the bindValue/bindParam
data in the custom statement class to get a complete query for 
> debugging. This is also great for doing EXPLAIN by just copy/pasting the queries.
>
> It was developed with the objective of zero changes to the existing db component code.
>
> The profiler can simply be added like this:
>
> $dsn = 'mysql://....';
> if ( ezcBase::inDevMode() )
> {
>      ezcDbInstance::set( ezcDbFactory::create( $dsn ),
> 'mysql_for_profiler' );
>      $dbh = ezcDbFactory::create( 'profiler://mysql_for_profiler' );
>      // uses ezcDbInstance::get( 'mysql_for_profiler' ) internally
> }
> else
> {
>      $dbh = ezcDbFactory::create( $dsn );
> }
> ezcDbInstance::set( $dbh );
>
> // ...
>
> $dbh = ezcDbInstance::get();
> if ( ezcBase::inDevMode() && $dbh instanceof ezcDbProfiler )
> {
>      // dump the array of ezcDbProfilerData structs
>      var_dump( $dbh->getProfilingInformation() );
> }
>
> The new handler implements:
>
> interface ezcDbProfiler
> {
>      public function getProfilingInformation();
>      public function logProfilingInformation( $query, $duration,
> $group=null );
>      // group is used to group by unprepared statements
> }
>
> I'd like to contribute the attached profiler code if there is interest in it.
>
> Regards,
> Andreas

A couple of notes:

. the replacing of 'SELECT' in mysql selects in db_handler_profiler.php might be too greedy:
what about columns called SELECTOR?

. baking in support for EXPLAIN PLAN into this class (or a subclass) would make it more interesting.
You can take a look at ezdb: it already implements 
'explain' for both mysql and oracle

bye
Gaetano


Mime
View raw message