NotORM panel – profiler panel pre Nette\Debug

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
srigi
Nette Blogger | 558
+
0
-

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.

download

download

Implementacia:

  • stiahnut Panel.php a panel.phtml a ulozit do %libsDir%/Diggriola
  • vytvorit BaseModel a metodu initialize()
  • 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
+
0
-

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.

sinacek
Člen | 23
+
0
-

srigi napsal(a):
download

Ahoj,
odkaz je nefunkční a v addons jsem to nenašel. Je to možné stáhnout někde jinde případně obnovit odkaz?
Dík

Mikulas Dite
Člen | 756
+
0
-

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.

srigi
Nette Blogger | 558
+
0
-

Pridal som to do extensions

japlavaren
Člen | 404
+
0
-

mam dotaz, ako zapisat

<?php
self::$notORM->debug = function($query, $parameters) {
	NotOrmPanel::getInstance()->logQuery($query, $parameters);
};
?>

PHP 5.2??
dakujem

Foowie
Člen | 269
+
0
-
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);
}
srigi
Nette Blogger | 558
+
0
-

Panel som presunul do projektu Diggriola.

Tomáš Votruba
Moderator | 1114
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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ů.