Ing. Jan Mittner
1. Profiling aplikací 2. Zend_Cache 3. Optimalizace výkonu databáze 4. Optimalizace rychlosti načítání webu 5. Další tipy pro zrychlení ZF 2
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
náročnost jednotlivých volaných SQL dotazů lze v Zendu profilovat (=měřit) prostřednictvím podkomponenty Zend_Db_Profiler Db Profiler 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 4
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 5
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ě
ORM v Zendu lze zrychlit prostřednictvím cachování metadat jednotlivých datových entit e.metadata.caching e.metadata.caching Zend_Db_Table_Abstract::setDefaultMetadataCache() kromě toho lze cache využít na řadu jiných komponent, které dokáže výrazně zrychlit pluginy Zend_Loader_PluginLoader::setIncludeFileCache(); config Zend_Date, Zend_Locale, Zend_Translate ▪ důrazně doporučuji cache používat
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
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í? 9
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 10
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ů optimalizace HTTP požadavků 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. 11