Asynchronní dotazy v MySQLi

Školení, která pořádám

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.

Jakub Vrána, Řešení problému, 8.10.2010, diskuse: 0 (nové: 0)

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.