tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

ako uvolnit pamat z dibi fluent?

před 9 lety

Matúš Matula
Backer | 236

Mám skript, ktorý beží v while(true) slučke, v každej z nich urobí niekoľko dotazov do DB pomocou dibi. Po čase php zahučí, že skript zožral všetku pamäť. Zrejme je to tým, že neuvoľňujem resource z dotazov.
Ak mám napr. takýto dotaz pomocou fluent interface

<?php
$userLangs = dibi::select('u.id AS userId, l.lang')
                    ->from('users')
                        ->as('u')
                    ->leftJoin('languages')
                        ->as('l')
                        ->on('u.languages_id = l.id')
                    ->fetchPairs('userId', 'lang')
?>

aká je best practice na uvoľnenie zdrojov? Je nutné si každý dotaz rozložiť na 2 časti (najprv resource, z neho nejaký fetchAll() a následne resource uvoľniť?) alebo to ide nejako lepšie?

před 9 lety

westrem
Člen | 398

Ja si myslim, ze najlepsie je si to rozdelit ako pises na 2 casti. tzn:

$r = dibi::select('u.id AS userId, l.lang')
                                        ->from('users')
                                                ->as('u')
                                        ->leftJoin('languages')
                                                ->as('l')
                                                ->on('u.languages_id = l.id');
$userLangs = $r->fetchPairs('userId', 'lang');

/*
 * spracovanie
 * ..
 */

// uvolnenie
$r->free();

Este otazka: Si si isty, ze problem je tu? Predsa len while(true) ma napada pouzit len velmi zriedkakedy a kludne moze pamat zrat aj nieco ine v tom cykle.

před 9 lety

Matúš Matula
Backer | 236

diky, tak som to myslel..a ci som si isty? to teda nie som :D while(true) je tam, lebo to bezi ako proces na pozadi stale..a v podstate to urobi xyz dotazov na DB, posle nejaky mail, zapise do log suboru..spadlo to po asi 10 hodinach…Neviem co ine by tam mohlo zrat tolko pamati [resp. nejaku, premenne v kazdej iteracii znova inicializujem]. Vyskusam uvolnit zdroje a ak to nepomoze, budem patrat dalej..

před 9 lety

phx
Člen | 652

I unset($r) by melo byt OK.

Nevim jak to poustit, ale pokud to bezi na Nette tak vypni dibi profiler. Ten si uklada vsechny SQL dotazy do DB, takze to tam taky puchne. Minuly tyden jsem to hledal snad hodinu.

před 9 lety

Matúš Matula
Backer | 236

Dik phx! na profiler som uplne zabudol, zrejme on bude ten zrut pamati..btw da sa nejako zistit co konkretne mi zerie kolko pamati cez konzolu?

před 9 lety

phx
Člen | 652

Nevim, jedine snad si nejak rucne porovnavat $GLOBALS