NotORM panel – profiler panel pre Nette\Debug
- srigi
- Nette Blogger | 558
Spravil som panelik pre NotORM, ktory loguje SQL dotazy, ktore NotORM kladie do DB. Nakolko profiler NotORM je velmi primitivny – vola iba callback ktoremu preda polozeny SQL dotaz a pole argumentov, neposkytuje panel ziadne info o casovej narocnosti dotazov.
Implementacia:
- stiahnut Panel.php a panel.phtml a ulozit do
%libsDir%/Diggriola
- vytvorit
BaseModel
a metoduinitialize()
- inicializovat DB connection v
app/bootstrap.php
- podedit
BaseModel
a klast dotazy (vid. API)
app/models/BaseModel.php
<?php
use Nette\Object,
Nette\Environment,
Nette\Diagnostics\Debugger,
PDO,
NotORM,
Diggriola\Panel;
class BaseModel extends Object
{
protected static $notORM = null;
public static function initialize()
{
$db = Environment::getConfig('database');
$pdo = new PDO("{$db['driver']}:host={$db['host']};dbname={$db['database']}", $db['username'], $db['password']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->query('SET NAMES utf8');
self::$notORM = new NotORM($pdo);
if ($db->profiler) {
$panel = Panel::getInstance();
$panel->setPlatform($db['driver']);
Debug::addPanel($panel);
self::$notORM->debug = function($query, $parameters) {
Panel::getInstance()->logQuery($query, $parameters);
};
}
}
}
app/bootstrap.php
$application->onStartup[] = 'BaseModel::initialize';
// pre "predpovedanie buducnosti"
Environment::getSession()->setExpiration('+ 90 days');
Environment::getSession()->start();
app/models/Article.php
class Article extends BaseModel
{
public static function test()
{
$articles = self::$notORM->article()
->select('id, title')
->where('text LIKE ?', '%PHP%')
->order('title')
->limit(10);
foreach ($articles as $article) {
print_r($article['title']); echo '<br>';
}
$rowId = self::$notORM->article()->insert(array(
'title' => 'Lorem',
'text' => 'ipsup dolor sit amet',
'published' => '2010-11-19 18:00:00',
'category_id' => '1',
));
}
}
Editoval srigi (1. 6. 2011 9:21)
- MzK
- Člen | 127
Používá ještě někdo NotORM v Nette a s dibi? Sháním nějaké návody pro nastavení NotORM na takovou úroveň podobnou dibi. Tak aby se SQL dotazy logovaly do debug baru, do souboru dibi.log, EXPLAIN dotazů, statické volání a tak, aby se nemuselo přepisovat moc kódu..
Je mi jasné, že dibi::fetchAll se bude muset přepsat ale statické volání by mohlo zůstat.. Prostě nějaké ukázky jak NotORM v Nette používat.
- Mikulas Dite
- Člen | 756
Nette Database má vlastní profiler, který je prý dokonce i lepší.
Ale pokud opravdu používáš NotORM a ne Nette Database, tak v tom případě nic.
- japlavaren
- Člen | 404
mam dotaz, ako zapisat
<?php
self::$notORM->debug = function($query, $parameters) {
NotOrmPanel::getInstance()->logQuery($query, $parameters);
};
?>
v PHP 5.2??
dakujem
- Foowie
- Člen | 269
self::$notORM->debug = callback($this, "notormDebug");
public function notormDebug($query, $parameters) {
NotOrmPanel::getInstance()->logQuery($query, $parameters);
}
nebo staticky
self::$notORM->debug = callback("nazev tridy", "notormDebug");
public static function notormDebug($query, $parameters) {
NotOrmPanel::getInstance()->logQuery($query, $parameters);
}
- Tomáš Votruba
- Moderator | 1114
Nevím, zda je to příliš troufalé, nicméně hrozně by se mi
hodilo znát časy trvání dotazů.
Takhle musím lézt do modelu a testovat dotaz po dotazu.
Myslím, že bych se spokojil i s opětovným provedením dotazů, tzn. že by měření časů probíhalo přímo v profileru při opětovném položení dotazů. To by šlo zapnout nějakým debugTime modem, kdybych potřeboval zjistit, jestli tam něco nehapruje.
Editoval Schmutzka (2. 12. 2011 10:45)
- srigi
- Nette Blogger | 558
Problem, je ze NotORM takyto udaj neposkytuje, vid. zdrojak. Raz som to Jakubovi na #posobota spomenul a on vravel ze by to bola dobra featura. Riesenia vidim tri:
- skusit to presadit u Jakuba Vranu (popr. mu poslat patch)
- prestudovat zdrojaky Nette\Database, lebo jej profiler tuto funkciu ma
- implementovat to vlastnymi silami (nejaky dirty hack s Debugger::timer).
Editoval srigi (2. 12. 2011 13:51)
- Tomáš Votruba
- Moderator | 1114
Tak po mnoha neúspěšných pokusech jsem se dostal aspoň k těmto poznatkům (kdo by to chtěl taky zkoušet):
V Nette\Db je se čas měří u funkce execute(), ta je v Notorm\Result.php:
// line ~ 561
protected function execute() {
$time = microtime(TRUE);
// ...
$_SESSION["NotORM_timer"][] = round(1000*(microtime(TRUE) - $time),0);
}
Zřejmě je to třeba i v NotORM/MultiResult.php
, kde je také
příkaz execute()
.
Tím lze (snad) evidovat jednolivé časy dotazů. Bohužel počet příkazů execute neodpovídá přímo počtu dotazů přes NotORM (20 vs. 22).
Kdo by chtěl pokračovat dál, zdroj na gitu: https://github.com/…Notorm-Panel
- spojil jsem „?“ a parametry, protože mi to přišlo logické a méně chaotické
- bez odřádkování u jednotlivých klíčových slov (v budoucnu by mohlo být volitelné)
- čas se ukazuje i rovnou v panelu, abychom viděli, kolik toho db „žere“ a nemuseli zbytečně jezdit na až doprava dolů
- časy jsou zaokrouhleny na ms, menší jak 1 ms vyblednuty; IMHO cokoli menší 1 ms nestojí ani za 1 s přemýšlení :)
Editoval Schmutzka (29. 12. 2011 16:18)
- gawan
- Člen | 110
super, vyzerá to výborne, tiež používam priamo NotORM v nette. Možno ešte to zalamovanie by sa hodilo, ale to by stačilo len pre queries dlhšie ako napr. 80 znakov (viac ako jeden riadok). Ja som si urobil takú jednoduchú funkciu pre konzolu, možno sa ti hodí. Nie je to dokonalé, ale stačí to:
<?php
public function formatQuery($query) {
$query = preg_replace(
'/WHERE|FROM|GROUP BY|HAVING|ORDER BY|LIMIT|OFFSET|UNION|DUPLICATE KEY/',
"\n$0", $query
);
$query = preg_replace(
'/INNER|LEFT|RIGHT|CASE|WHEN|END|ELSE|AND/',
"\n\t$0", $query
);
return $query;
}
?>
- Tomáš Votruba
- Moderator | 1114
Po všech pokusech zde existuje i snadná implementace pod Nette DB debug bar, tedy i s měřením kýženého trvání příkazů.