[ Goran Rakić @ 24.06.2010. 16:21 ] @
PHP 5.3 doneo je mysqlnd, novi drajver koji se koristi za povezivanje sa MySQL serverom preko mysql, mysqli i PDO_MYSQL funkcija. mysqlnd ima poseban API za pisanje dodataka u C-u koji se izvršavaju između PHP-a i poziva ka MySQL serveru. Ovo omogućava da posebni dodaci transparentno izmene sve mysql_*, mysqli_* i PDO_MYSQL funkcije i dodaju novi API.

Novi MySQLnd Query Cache Plugin for PHP ne menja API PHP funkcija ali dodaje klijentsko keširanje MySQL upita. MySQL od izdanja 4.0.1 ima serversko keširanje rezultata. To grubo znači da će MySQL optimizer da prepozna iste SELECT upite i, ako u međuvremenu nije bilo izmena poslati keširani odgovor bez ponovnog izvršavanja upita. Međutim zahtev i podaci i dalje putuju do MySQL servera i nazad.

Klijentsko keširanje do sada je uglavnom imalo sledeći obrazac koristeći memcached server i PECL/memcache klijent:
Code (php):
$mysqli = new mysqli; $memcache = new Memcache;
...
$sql = 'SELECT * FROM ... LEFT JOIN ... LEFT JOIN ... WHERE ...';
$key = md5('mysql_'.$sql);

if(!$large_result = $memcache->get($key)) {
    // nije keširano ili je keš istekao
    $r = $mysqli->query($sql);
    $large_result = $r->fetch_all();
    $r->free();

    // keširaj 60 sekundi
    $memcache->set($key, $large_result, MEMCACHE_COMPRESSED, 60);
}


Mysqlnd qc dodatak spušta ovaj kod nivo ispod svih mysqli poziva. Komentar - savet ⁄*qc=on*⁄ u upitu kaže dodatku da kešira ovaj upit
Code (php):
$r = $mysqli->query('/*qc=on*/'.$sql);
$large_result = $r->fetch_all();
$r->free();




Za samo smeštanje podataka dodatak može da koristi memoriju procesa, memcached, APC,... a moguće je i napisati novi handler koji određuje prostor i strategiju. Taman dok se malo ne stabilizuje razvoj, biće zanimljivo isprobati ovo u narednom projektu.
[ Nikola Poša @ 24.06.2010. 21:52 ] @
Sjajna vest. Jel možda već neko ima informacije iz prve ruke oko svega ovoga? Jel imao neko prilike da isproba ovaj novi drajver, sa sve tim plugin-om za keširanje?
[ zikaa @ 26.06.2010. 20:49 ] @
Fenomenalno, moracu to da probam kolko odmah :)) i okacicu ovde kako ce se pokazati
[ MMX @ 27.06.2010. 06:01 ] @
Znači memcache u stvari funkcioniše kao struktura u kojoj se čuvaju izvršeni upiti (tako sam shvatio iz Goranovog koda)? Pre izvršenja, proveri se da li takav query postoji u memoriji, ukoliko da, vrati se keširani rezultat, ukoliko ne, izvršava se novi upit nad bazom.
[ Goran Rakić @ 27.06.2010. 10:27 ] @
Memcache je interfejs prema memcached serveru tako da keš ostaje i između dva poziva. Memcache ima još mogućnosti, ali to je za posebnu temu. Uopšteno obrazac je takav, pred neku dužu operaciju pitaš da li je rezultat u kešu i ako nije izračunaš i smestiš u keš za naredne zahteve. Keširaju se stanja objekta, komadi HTML šablona, rezultati funkcija, rezultati upita i veb servisa,...

Za keširanje rezultata upita treba razmisliti od situacije do situacije u kakvom su odnosu SELECT i INSERT/DELETE, te pruža li MySQL serverski Query Cache dovoljno ubrzanje.