Knihovna MySQLnd, která je součástí PHP od verze 5.3, nabízí poměrně zásadní funkční novinku spočívající v podpoře asynchronního kladení dotazů. Tato novinka je k dispozici prostřednictvím extenze MySQLi, jak je ale u této extenze bohužel zvykem, tak API je prakticky nepoužitelné.
Vytvořil jsem proto jednoduchou knihovnu, která nabízí API naopak velmi přívětivé:
<?php // předání přihlašovacích údajů $db = new MysqliAsync("localhost", "ODBC", ""); // položení dotazů $db->test1("SELECT 'test1'"); $db->test2("SELECT 'test2'"); // získání výsledků print_r($db->test1()->fetch_row()); print_r($db->test2()->fetch_row()); ?>
Knihovna je k dispozici na GitHubu.
A proč vůbec pokládat dotazy do databáze asynchronně? Hlavní motivací je samozřejmě výkon. Při synchronním pokládání dotazů může běžet vždy jen jeden dotaz najednou, PHP skript navíc čeká na získání odpovědi a nemůže dělat nic jiného. Při asynchronním spuštění může běžet dotazů více, což je obzvlášť užitečné, pokud používáme replikaci a dotazy rozstrkáme na různé servery. PHP skript si navíc může dělat svoji práci (např. sestavit šablony) a před jejich použitím jen v klidu počkat, než přijde odpověď (pokud už mezitím nedorazila). Ideální je tedy co nejdřív po začátku skriptu položit dotazy, pak udělat všechnu ostatní práci a těsně před koncem data použít.
V rámci objektivity je samozřejmě nutné uvést, že asynchronní dotazy nemusí výkonnost zlepšit vždy. Každý asynchronní dotaz totiž musí použít vlastní připojení k databázovému serveru, jehož navázání stojí nějaký čas. Pokud tedy ve skriptu pokládáme samé rychlé dotazy (nebo jen jeden pomalý někde na začátku stránky) nebo mezi položením pomalého dotazu a zpracováním jeho odpovědi neděláme nic zásadního, tak se asynchronní dotazy nemusí vyplatit.
Benchmarky jsem nedělal, zásadně budou záležet na charakteru aplikace.
Diskuse je zrušena z důvodu spamu.