ugrás a tartalomhoz

mysqli_free_result()

szabo.b.gabor · 2008. Szep. 17. (Sze), 21.00
Sziasztok!

a php manualban ez található:
Note: You should always free your result with mysqli_free_result(), when your result object is not needed anymore.


kérdésem az volna, hogy ha én ezt a lépést kihagyom, de ugyanabba a változóba beleteszek egy másik mysqli_result-ot, azzal pazarlok-é memóriát, vagy sem? tud-e erről valaki valamit?

köszönöm szépen,
gábor
 
1

Másik idézet

Poetro · 2008. Szep. 17. (Sze), 21.38
mysql_free_result() only needs to be called if you are concerned about how much memory is being used for queries that return large result sets. All associated result memory is automatically freed at the end of the script's execution.
2

harmadik idézet (:

szabo.b.gabor · 2008. Szep. 18. (Cs), 10.23
mysql-nél lehet, hogy ez van, de most mysqli-ről beszélünk, ami teljesen más. gondolom.
3

Egy ideális univerzumban...

vbence · 2008. Szep. 18. (Cs), 11.30
használnál valami burkoló objektumot az adatbázishoz (ami például inicalizálja a megfelelő karakterkódolást, megosztja a kapcsolatot több query között, mivel a mysqli-ben nincs prezisztens kapcsolat) stb. Ilyenkor az objaktum query metódusa felszabadíthatná az előző result setet, a destruktor pedig az utolsó még élő result setet.

A probléma ott van, hogy én pl. egyáltalán nem tudom, hogyan működik a PHP garbage collectionje. (Fura, hogy eddig ez fel se tűnt...) Ráguglizva meg a top X helyen buta bologok vanak meg zömében kérések. Még a php oldal saját keresője se mond semmit. Ugyanez a helyzet a "zend 2.0 garbage collection" kombinációval...
4

igen

szabo.b.gabor · 2008. Szep. 19. (P), 07.37
rátapintottál a lényegre.

szóval ez volna a helyzet pontosan. és igazából nem nagy cucc megcsinálni, mert mielőtt van egy query, azelőtt megnézem, hogy a result-om objektum-e, és ha igen, akkor megmondom neki, hogy free_result.. mondjuk a destruktorból ezt kihagytam, de majd beleteszem (:

csak arra lennék kíváncsi, hogy ezzel jót csinálok-é, vagy csak szopatom a szervert :)

memóriafelhasználást hogyan lehet jól mérni? végülis azt hiszem tudom.. kipróbálom, ha nem kell épp dolgoznom és az asszony sem öl meg..
5

Eredmények

szabo.b.gabor · 2008. Szep. 19. (P), 10.28
a következőre jutottam a tesztek során..

test.php:

<?php
/*
 * Created on 2008.09.17.
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */
define('ACCESS',1);

require('include/init.php'); #mindenféle hülyeségeket csinál, többek között létrehoz egy $DB változót
header("Content-Type: text/html; charset=UTF-8");

#init phase
//for($i=0;$i<5000;$i++){
//	$DB->query("INSERT INTO rubbish (data) values ('".$C->randStr(500)."')");
//}

SysMonitor::init();

for($i=0;$i<1000;$i++){
	$DB->query("SELECT data FROM rubbish ORDER BY RAND() LIMIT 20");
}

SysMonitor::end();

?>

DB.class.php:

<?php

class DB {
	private $db;		//MYSQL_KAPCSOLAT
	private $keres;			//A FUTTATANDO LEKERDEZES
	private $eredmeny;		//EREDMENYEK
	
	/**
	 * Constructor
	 * Adatbazis kapcsolatot hoz letre.
	 */
	function __construct() {
		if($this->db=mysqli_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PASS)){
			if(!$this->db->select_db(MYSQL_DB)) die(MYSQL_DB.' - adatbazis nem letezik!');
			$this->db->query("SET NAMES utf8");
		}else{
			die('mysql kapcsolódás nem sikerült!');
		}
	}
	
	function __destruct(){
		$this->db->close();
	}
	
	/**
	 * Vegrehajt egy lekerdezest
	 * 
	 * @param $keres string - a lekerdezes
	 */	
	function query($keres = null,$noError=false){
		SysMonitor::checkMem();
		if(!$keres) $keres=&$this->keres;


####################
## $result->free();
####################

		if(is_object($this->eredmeny)) $this->eredmeny->free();

####################
## end
####################
		if(!($this->eredmeny=$this->db->query($keres)) && MYSQL_DEBUG && !$noError){
			print('Hiba a lekérdezésben!<br />'.$this->db->error().$keres.'<br />');
		}
		return $this->eredmeny;
	}

	#egyéb hasznos dolgok jöhetnek ide...
	
}
?>
SysMonitor.class.php:

<?php

class SysMonitor {
	private static $execStart;
	private static $maxMemUsed;
	private static $currMemUsed;
	
	public static function init(){
		self::$execStart=microtime(true);
		self::$maxMemUsed=0;
		self::checkMem();
	}
	
	public static function end(){
		self::checkMem();
		$execTime=microtime(true)-self::$execStart;
		echo"Execution time was: $execTime\nMax memory used: ".self::$maxMemUsed." bytes\n\n";
	}
	
	public static function checkMem(){
		self::$currMemUsed=memory_get_usage();
		if(self::$currMemUsed>self::$maxMemUsed) self::$maxMemUsed=self::$currMemUsed;
	}
}
?>
az eredmények meg a következők (1 mérés nem mérés..):
with free_result();
Execution time was: 25.0868430138 Max memory used: 180544 bytes
Execution time was: 25.103053093 Max memory used: 180544 bytes
Execution time was: 24.5633080006 Max memory used: 180544 bytes

without free_result();
Execution time was: 25.0674118996 Max memory used: 179756 bytes
Execution time was: 25.0201859474 Max memory used: 179756 bytes
Execution time was: 24.9304628372 Max memory used: 179756 bytes

((: hát ennyi. bár lehet hogy rosszul monitoroztam a dolgokat, meg azt sem tudom, hogy pl a myslq által használt memóriát hogyan lehet mérni.. tehát ok, hogy a php-nak nem számít, de a mysql-nek?

javaslatok??