Nejste přihlášen(a)
Jednou z nedokončených věcí v dibi je logování a profilování. Kdysi
jsem k tomu chtěl použít handlery (metody dibi::addHandler(),
dibi::startLogger()), ale dnes se mi zdá vhodnější nasazení
jediného objektu do pozice loggeru & profileru. Od revize 155 je tedy
možné zapnout nad každým spojením profiler. A to buď přímo při
připojování:
dibi::connect(array(
'driver' => 'sqlite',
'database' => 'sample.sdb',
'profiler' => TRUE,
));
Nebo manuálně:
$profiler = new DibiProfiler;
dibi::getConnection()->setProfiler($profiler);
Profiler je objekt implementující rozhraní IDibiProfiler, jako výchozí se používá DibiProfiler. Ten umí logovat do souboru a do konzoly Firebugu.
// logování do souboru:
dibi::getProfiler()->setFile('log.sql');
// náhrada za dřívější dibi::startLogger('log.sql')
Logování do Firebugu se zapíná automaticky, je-li detekována jeho přítomnost. Vyžadován je Firefox verze 2 nebo 3, nainstalované a zapnuté rozšíření Firebug a FirePHP.
Zatím jde stále o rozpracovanou koncepci, implementace není kompletní. Bud rád za připomínky.
Tak pevni problem:
firebug vyhazuje chybu:
Variable Viewer Close
array(
[0] =>
'There was a problem writing your data from X-FirePHP-Data['FirePHP.Firebug.Console'] to the console.'
...
[1] =>
array(
... 4 elements ... )
['name'] =>
'SyntaxError'
...
['message'] =>
'Bad string'
...
['at'] =>
2
...
['text'] =>
'{{"FirePHP.Firebug.Console":[["TABLE",["dibi profiler (1 SQL queries took 0.685 ms)",[["Time","SQL Statement","Rows","Connection"],["0.685","SELECT * FROM `portal_articles` ORDER BY `a_created`",4,"mysqli\/0"]]]]]}"FirePHP.Firebug.Console":[["WARN","Notice: Undefined index: callback in \/home\/simon\/Workspace\/php\/nette\/project\/bassportal\/app\/presenters\/AdminModule\/ArticlesPresenter.php on line 29"],["WARN","Notice: Undefined index: query in \/home\/simon\/Workspace\/php\/nette\/project\/bassportal\/app\/presenters\/AdminModule\/ArticlesPresenter.php on line 32"],["WARN","Notice: Undefined index: delData in \/home\/simon\/Workspace\/php\/nette\/project\/bassportal\/app\/presenters\/AdminModule\/ArticlesPresenter.php on line 35"]]}'
...
)
)
nejak se tam do profileru pripletly i notice pri neexistenci indexu. tu chybu si odstranim ale podle me by mel byt vypis profileru a zatim dva notice.
na strance pouzivam toto volani databaze s pouzitim dibitable
<?php
require_once 'models/AdminModule/Articles.php';
$articles = new Articles;
$articlesData = $articles->findAll('a_created');
?>
Tam asi dochází k tomu, že do firebugu zapisují dvě různé třídy,
konkrétně dibi a Nette\Debug. Zatím spolu bohužel nespolupracují, takže
laděnku vypni: Debug::$useFirebug = FALSE
aha, tak to me nedoslo. vypinat to asi nebudu, delam ted hodne prenosu na pozadi, takze firebug potrebuju. kazdopadne diky.
Bylo by mozne opet zachovavat zpetnou kompatibilitu alespon nekolik verzi?
Nebo danou funkci zachovat po nejakou dobu s tim, ze by vyhazovala vyjimku (ladenka) s popisem co se zmenilo.
Pokud neni na serveru dostupna funkce json_encode(), potom pri zaplem
dibiprofileru dostanu pouze bilou stranku smrti. Vyresil jsem to pripojenim do
bootstrapu soubor compatibility.php z nette. ale to neni elegantni protoze se
fce vola vzdy, ikdy treba neni zadny dotaz na databazi.
Slo by nejak tu fci zapracovat do profileru?
jo a ani s tou fci to poradne nefunguje. firebug hazi nasledujici chybu:
array(
[0] => 'There was a problem writing your data from X-FirePHP-Data['FirePHP.Firebug.Console'] to the console.'
[1] => array(
['name'] => 'SyntaxError'
['message'] => 'Bad string'
['at'] => 173
['text'] => '{"FirePHP.Firebug.Console":[["TABLE",["dibi profiler (1 SQL queries took 0.207 ms)",[["Time","SQL Statement","Rows","Connection"],["0.207","SELECT *,DATE_FORMAT(a_created,\'%e. %c. %Y %H.%i:%s\') as fCreated FROM `portal_articles` INNER JOIN `portal_admin_users` ON au_id = a_author ORDER BY a_created DESC",5,"mysqli\/0"]]]]]}'
)
)
Tato funkce je tusim v balicku Nette v jednom souboru. Pokud se nepletu tak json_encode() je az od PHP 5.3
http://cz2.php.net/…n-encode.php
je od verze (PHP 5 >= 5.2.0, PECL json:1.2.0–1.2.1) ale na serveru mi chybi prave ten PECL
a nahodou v jakem soubou je to nevis?:D
OK
Nette/examples/compatibility.php
http://code.google.com/…tibility.php
Editoval phx (25. 10. 2008 13:02)
Spojení na FirePHP už funguje nezávisle na Nette, používá vlastní json_encode v PHP < 5.2 a updatoval jsem na novější verzi protokolu.
Vyžaduje FirePHP minimálně ve verzi 0.2 (ke stažení na http://www.firephp.org)
diky uz to funguje skvele.
mozna ale stejnym neduhem trpi i nette. tohle mi pristalo v error logu:
PHP Fatal error: Call to undefined function json_encode() in /domains1/nh441700/public/libs/Nette/Application/AjaxDriver.php on line 82
U Nette deklaruju minimální verzi PHP 5.2.2, takže to už nechám na uživateli, aby si zajistil vložení souboru compatibility.php. Tam totiž nemusí fungovat i víc věcí.
Chci se zeptat, jde nejak nastavit aby na ostrem serveru nebyli sql dotazy
logovany firebugem ale dalo se zapisovat pouze do souboru?
Predem diky.
Zkousel jsem totiz Debug::$useFirebug = false; ale to hlasi ze pristupuju neopravnene k privatnimu atributu.
Na ostrém serveru se loguje pouze do souboru.
No tak to mam teda nekde chybu. Protoze na ostrem serveru se mi loguje jak do firebugu (SQL) tak i do souboru.sql
v configu mam toto
;produkcni [production < common] ;database database.driver = mysqli database.lazy = true database.host = localhost database.user = asdfasdf database.pass = asdfasdfasdf database.database = asdfasdfasfasf database.charset = utf8 database.profiler = true ;aplication variable.enableProfiler = false mode.live = yes mode.debug = false
logovani spoustim v bootstrapu takto
dibi::getProfiler()->setFile(LOGS_DIR . ‚/dblog.sql‘);
Pardon, neuvědomil jsem si že nejsem na fóru Nette ale dibi :-)
Jasně, u dibi se produkční a vývojářský mód nerozlišuje. Spíš mě nenapadlo, že by bylo užitečné logovat SQL příkazy na produkčním serveru. K čemu je to dobré?
Napriklad doma mam par destovacich dat v DB a jsem linej tvorit „zbytecna“ kvanta dat kuli testovani zateze a tak. Na produkcnim serveru se to casem udela samo a dle logu pak mohu vyhodnotit co kde je spatne, co kde vazne a spol. Navic tam muze byt jinak nastavena DB a tak by bylo fajn vedet, ktere dotazy ji „nedelaji dobre“ a co upravit na nastaveni DB.
Coz ale vytvari druhou otazku: co rotovani logu? Kdysi jsem delal neco na principu nazev.{cislo_dne_v_tydnu_tzn0-7}.log. + pokud je soubor starsi nez dnes tak smaz a loguj. Takze jsem mel 7 dni stare logy maximalne. Jen clovek musel vedet co je za den aby se podival do sptavneho souboru.
Chtěl bych upozornit, že v quick start je ještě starý způsob logování:
dibi::startLogger('log.txt', TRUE);
Když jsem zkoušel logování
dibi::getProfiler()->setFile('log.sql');
, tak mi to uloží jen první sql dotaz, další dotazy se už nepřidají, když sql dotaz selže, tak se neuloží vůbec. Dělám něco špatně, nebo jsem nepochopil princip?
Editoval tondovo (26. 11. 2008 14:33)
No podle me se ukladaji vsechny dotazy ale jen jednou. tak je to aspon
u me.
Kazdopadne mi to porad loguje do firebugu i do souboru. fakt nevim cim
to je,
Pockej az se k tomu vyjadri David, opravdu nevim jake dotazy se presne loguji.