K novinkách v chystaném php 5.3 patří také mysqlnd. První věc, co člověka napadne, když uvidí ten název, že se jedná o nové rozšíření pro práci s mysql. Ale tak to není. Jedná se o náhradu libmysql, neboli toho, co stojí pod ext/mysql, ext/mysqli, ext/pdo_mysql. Jde tedy o úplně novou implementaci samotného mysql protokolu mezi klientem a serverem. Jaké výhody to bude mít oproti použití libmysql a proč se k tomu vývojáři uchýlili?
Rozšíření pro mysql jsou jedním z nejpoužívanějších rozšíření v PHP vůbec, o tom svědčí písmeno M v názvech jako LAMP, WAMP. Samotná rozšíření jsou vlastně wrappery nad libmysql, jako ostatně většina rozšíření. Libmysql je knihovna dodávána přímo firmou MySQL AB k mysql serveru jako klientské API pro C/C++ a rozšíření se jí musí hodně přizpůsobovat a nemohou nevyužít všech možností Zend Engine - motoru PHP. Dalším aspektem je licence, o tom dále.
Mysqlnd bude tedy implementace mysql klient/server protokolu jen a pouze pro PHP a optimalizována pro použití s PHP (resp. Zend Engine). Hlavní výhody budou
- vetší rychlost
- menší paměťová náročnost
- použití stream API
- performance statistiky vhodné pro hledání úzkých míst
- podpora cachování
- jednodušší kompilace
- vlastní vývojový cyklus, snadnější a rychlejší integrace nových funkcionalit a rychlejší opravování chyb
Dalším aspektem je licence, MySQL server, jehož součástí je i libmysql, je pod licencí GNU GPL, která není kompatibilní s PHP licencí, pod kterou je distribuováno PHP. Proto se PHP vývojáři museli dohodnout s MySQL AB na takzvané FLOSS výjimce. Mysqlnd se to pochopitelně týkat nebude a bude pod PHP licencí.
Lepší integrace mysqlnd se Zend Engine se týká zejména správy paměti. První obrázek je z prezentace Andreye Hristova. V mysqlnd bude použit memory management Zend Engine kompatibilní s nastavením memory limitů v php.ini, což nám také umožní pružnější alokaci paměťových bloků a jejich cachování. Tím by se mělo dosáhnout větší rychlosti, vyhnout se memory leakům atd.
Další věc související se správou paměti je vlastní načítání dat z databáze. Při
použití libmysql se data z databáze načtou do interních bufferů libmysql a při
mysql_fetch_*()
se nakopírují do bufferů, které představují PHP proměnné.
Integrace mysqlnd se Zend engine umožní data z databáze načíst rovnou do zval
a při mysql_fetch_*()
se pak použije jen reference místo kopírování.
Vice je viz třeba blogpost Ulfa Wendela.
Mysqlnd bude interné používat PHP stream API, takže bude možné se zavěsit přímo na komunikaci s mysql databází, provádět filtrování apod. Nicméně použítí streamu přímo ze skriptu ještě není možné.
V mysqli je použití persistentích spojení nemožné, s mysqlnd se to změní, více v tomto blog postu.
Pomocí phpinfo(), mysqli_get_client_stats(), mysqli_get_connection_stats()
bude možné
monitorovat performance a optimalizovat použití databáze v aplikaci. Více opět v blogpostu
Ulfa Wendela. V mysqlnd bude možné použít i
klientskou cache pro výsledky dotazů, nicméně tato část je v mysqlnd zatím jen experimentálně, není zatím
úplně funkční podpora zneplatnění obsahu cache.
Výčet výhod vypadá poměrně zajímavě, z rošíření jsou pro mysqlnd připraveny ext/mysql, ext/mysqli
na ext/pdo_mysql
se pracuje. Uvidíme jak to bude v PHP 5.3 skutečně vypadat. Už teď je jasné, že
ne všechny výše popsané věci tam budou, hlavně klient cache a použití stream API. Uvidíme také, zda udržovat
samotné mysql client API funkcionálně kompatibilní s originální implementací od MySQL AB bude skutečně tak jednoduché, jak
vývojáři tvrdí.
Komentáře (0)
Komentáře jsou uzavřeny.