110 likes | 240 Views
Ing. Jan Mittner. 4IT445 – Optimalizace výkonu. Osnova. Profiling aplikac í Zend_Cache Optimalizace výkonu databáze Optimalizace rychlosti načítání webu Další tipy pro zrychlení ZF. Profiling aplikac í. nový plugin umožňující profiling v konfiguraci profiler.enabled = 1
E N D
Ing. Jan Mittner 4IT445 – Optimalizace výkonu
Osnova • Profiling aplikací • Zend_Cache • Optimalizace výkonu databáze • Optimalizace rychlosti načítání webu • Další tipy pro zrychlení ZF
Profiling aplikací • nový plugin umožňující profiling • v konfiguraci profiler.enabled = 1 • pro vypsání dát do URL ?profiler=1 • vypisuje i log z databázového profileru
Profilování SQL dotazů • náročnost jednotlivých volaných SQL dotazů lze v Zendu profilovat (=měřit) prostřednictvím podkomponentyZend_Db_Profiler • DbProfiler je schopen monitorovat veškeré volané SQL dotazy v rámci aplikace včetně délky jejich trvání, vstupních parametrů apod. • na základě získaného profilování lze optimalizovat počet dotazů a jejich výpočetní náročnost • výstupy z profilování lze mj. publikovat prostřednictvím Firebug rozšíření Firefoxu, resp. v kombinaci s rozšířením FirePHP, které je schopno do Firebugu dodávat data z logování na serveru • http://www.firephp.org/ • http://framework.zend.com/manual/en/zend.db.profiler.html
Zend_Cache • Zend komponenta zajišťující cachování dat s cílem optimalizace výkonu aplikace • komponenta nabízí uložení vybraných dat do cache • u cache je možné nastavit libovolnou i neomezenou trvanlivost či cache v závislosti na aktualizaci cachovaných dat ad-hoc mazat • http://framework.zend.com/manual/en/zend.cache.html
Zend_Cache • cachovat můžeme různé věci – tzv. frontendy • core - téměř libovolná data • output - výstup akce v rámci MVC • page - celou stránku • cache můžeme ukládat na různá místa – tzv. backendy • soubory • databáze • memcached • invalidace cache • vypršením expirační doby • pomocí konkrétního cache id • pomocí tagů – doporučuji • ideálně pomocí observeru na dané entitě
Zend_Cache • ORM v Zendu lze zrychlit prostřednictvím cachování metadat jednotlivých datových entit • http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.metadata.caching • Zend_Db_Table_Abstract::setDefaultMetadataCache() • kromě toho lze cache využít na řadu jiných komponent, které dokáže výrazně zrychlit • pluginyZend_Loader_PluginLoader::setIncludeFileCache(); • config • Zend_Date, Zend_Locale, Zend_Translate • důrazně doporučuji cache používat
Řešení pomocí observerů • v bootstrapu se navěsí observer My_Cache na Product • obě třídy implementují příslušná rozhraní • když se jakkoliv změní objekt třídy Product, pošle všem svým observerům notifikaci • observer My_Cache si zjistí tzv. cache tagy daného produktu: např. „Product_123“, „Products“ • invaliduje všechny cache záznamy s příslušnými tagy
Úkoly • Zend_Cache • implementujte cachování metody count v modelu Products • využijte frontend Core • nejdříve s nastavenou expirační dobou • následně s využitím observeru cache na modelu • implementujte cachování ve vyhledávání produktů • vyzkoušejte využít frontend Core – funguje? proč ano/ne? • vyzkoušejte využijte frontend Output • nejdříve s nastavenou expirační dobou • následně s využitím observeru cache na modelu • funguje správně vyhledávání?
Optimalizace výkonu databáze • vhodně zvolené databázové indexy pomáhají řádově snížit náročnost SELECT dotazů včetně joinování tabulek • můžete využít dotaz EXPLAIN SELECT ... • pečlivě volte datové typy a jejich rozsahy jednotlivých sloupečků tabulek, při velkých objemech dat má optimalizace datových typů vliv na rychlost SELECT dotazů • v rámci složitějších případů je třeba nalézt rovnováhu mezi počtem SQL dotazů a jejich složitostí • někdy se vyplatí spíše řešit část datové vrstvy v aplikační rovině namísto složitých SQL dotazů, resp. velkého počtu dílčích dotazů • můžete využít speciálních rozšíření MySQL, např. Spatial Extension pro práci s body v rovině/prostoru • vyhýbejte se subselectům, používejte joiny • výrazně rychlejší, pokud jsou správné indexy
Co a jak dále optimalizovat? • optimalizace logické vrstvy aplikace – nástroj Xdebug je schopen poskytnout profilování celé aplikace, čili informace o každém volání metody apod., jak byla náročná na CPU, RAM atd. • optimalizace javascriptu • pomocí nástrojů jako Firebug pro Firefox či Speed Tracer pro Google Chrome je možné profilovat výkon javascriptové vrstvy • pomocí obfuskátorů je možné minimalizovat velikost javascriptových souborů • optimalizaceHTTP požadavků • http://blog.proteus.cz/optimalizace-rychlosti-webu-snizeni-poctu-http-pozadavku • GZIP komprese je schopna výstupy serveru komprimovat do GZIP formátu, který si následně klient po doručení dekomprimuje – optimalizace objemu přenesených dat • dále mohou pomoci tzv. CSS sprity • více viz. http://developer.yahoo.com/performance/rules.html