Všechny dibi query do profileru
- na1k
- Člen | 288
Profiler je skvělá věc, ale velice by se mi hodilo, kdyby vedle „number of sql queries“ bylo možné nechat si tyto dotazy vypsat (nějaké rozklikávátko nebo cokoliv).
Vím, že dibi má vlastní profiler, který ale posílá výstup do souboru. Netuším ale, jestli si ho i nějak schraňuje a bylo by možné si dotazy natáhnout do profileru podobně, jako lze přidat například verzi Nette nebo poslední query.
Je na to tedy nějaká finta?
- Panda
- Člen | 569
Integrovaný profiler v dibi vypisuje dotazy do FirePHP (pokud byly vykonány před odesláním hlaviček). Pokud ale nepoužíváš Firefox a tím pádem ani nemáš k dispozici Firebug, nebo potřebuješ i dotazy po odeslání hlaviček, můžeš si napsat vlastní profiler, kde si s SQLkem uděláš co chceš. Může vypadat třeba takto:
<?php
class MyDibiProfiler extends DibiProfiler
{
public function after($ticket, $res = NULL)
{
parent::after($ticket, $res);
list($connection, $event, $sql) = $this->tickets[$ticket];
if ($event & self::QUERY)
Debug::consoleDump($res, $sql);
}
}
?>
V konfiguraci databáze pak stačí nastavit vlastní profiler:
database.profiler = MyDibiProfiler
- Panda
- Člen | 569
Díky. Ještě by možná někoho mohl inspirovat kód mého profileru – využívá FirePHP a každý SQL dotaz prožene EXPLAINem, krásně se s tím ladí indexy:
<?php
class MyDibiProfiler extends DibiProfiler
{
public function after($ticket, $res = NULL)
{
parent::after($ticket, $res);
list($connection, $event, $sql) = $this->tickets[$ticket];
if ($event & self::QUERY) {
if ($this->useFirebug) {
if (String::startsWith($sql, 'SELECT')) {
$table = array();
$res = dibi::query('EXPLAIN EXTENDED %sql', $sql);
$table[] = $res->getColumnNames();
foreach ($res as $row)
{
$tr = array();
foreach ($row as $value)
$tr[] = $value;
$table[] = $tr;
}
$res->free();
Debug::fireLog($table, 'TABLE', 'EXPLAIN EXTENDED ' . $sql);
}
}
}
}
}
?>
- Ondřej Brejla
- Člen | 746
To by bylo dobré někam šoupnout, aby to tu nezapadlo…ale nejsem si jist, jestli je to Nette extras ;)