mysql - PHP: How to Cleanup after Generator Function -


after research, have been sold on idea of generators (more generally, iterators) lots of tasks buffer results array, since memory usage o(1) instead of o(n).

so plan use generators handle database results queried via mysqli. have 2 questions regarding approach have not been able find answers on, , hoping community can give me creative solutions:

  1. is there way release resources opened generator, if consuming code chooses not iterate results? using iterator class, 1 might in __desctruct method. but, tests, generator not execute code following iteration sequence if not conclude naturally. looking workarounds prevent having create iterator subclass. see code below.

  2. does using generator or iterator provide benefit database results? of snooping seemed indicate mysqli might loading resultset memory anyway (mysqli_store_result), defeating purpose of iterator. if results not buffered, curious whether multiple queries can executed while resultsets being iterated (fetched) @ same time (think nested loops iterating on set of items , query child items each parent). seems database cursor might lock during entire iteration.

example

the below simplification of mean cleanup. tests, result gets freed if entire result iterated. if there exception or break in consuming loop, results never freed. perhaps overthinking , garbage collector enough?

function query($mysqli, $sql){   $result = $mysqli->query($sql);   foreach($result $row){     yield $row;   }   $result->free(); //never reached if break, exception, take first n rows, etc. } 

tl;dr curious how free resources used generator, , subsequently if generators database access saves anything, or if results buffered anyway

update

it looks here (http://www.php.net/manual/en/mysqlinfo.concepts.buffering.php) php buffers queries default, possibly defeating purpose of generators. although argument made buffering 1 array better creating copy of buffered array , having 2 buffered sets.

i looking experience in matter weigh in. thoughts appreciated!

i may little late party, if using generators , need clean when finished (say break parent loop before finished looping through everything), can use try/catch/finally cleanup in block:

function query($mysqli, $sql) {   $result = $mysqli->query($sql);   try {     if ($result) {       foreach($result $row) {         yield $row;       }     }   } catch (exception $e) {     throw $e; // send stack (or handle here)   } {     $result->free(); // clean when loop finished.   } } 

Comments

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

jsf - How to ajax update an item in the footer of a PrimeFaces dataTable? -

django - CSRF verification failed. Request aborted. CSRF cookie not set -