Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

30. 11. 2007 PHP

Co znamená mysqlnd

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.

humor

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.

humor

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

humor

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.