Nette\Database mimo frameworku
- mochja
- Člen | 20
Zdravím,
pokúšam sa vytvoriť inštanciu nettedb mimo konfigurátor, resp. mimo
frameworku. Narazil som však na problém ak sa dotazujem pomocou fluent
interface, nastane memory leak – pri 20k rows mem. usage cca 20MB.
Ak však napíšem dotaz pomocou metódy query mem usage je 2MB.
Je to spôsobené tým, že nepoužívam cache ? alebo je problém niekde inde ?
$db = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=test', 'root', '');
$data = $db->table('products')->select('id'); # 19MB
//$data = $db->query('select id from products'); # 2MB
foreach ($data as $row) {
break;
}
Nette 2.0.10, PHP 5.4.9
Editoval mochja (9. 4. 2013 3:20)
- enumag
- Člen | 2118
Jo jasně, $row si ještě referenci na selection uchovává takže se paměť neuvolní. Každopádně tohle není memory leak.
$data = $db->table('products')->select('id');
Tohle vrací Selection, které si ukládá do paměti všechny řádky.
$data = $db->query('select id from products');
Tohle vrací Statement, který si při procházení řádky nikam neukládá, vždy ti vrátí ten aktuální a předchozí zahodí.
$data = $db->query('select id from products')->fetchAll();
Schválně zkus ještě tento kód. Pokud se nemýlím, paměť by měla v tomto případě také vyskočit nahoru.