php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.10.2007, 17:43  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard Speicherhandling PHP

Hallo zusammen,

wir rätseln grade, wie sich PHP bei einem unset() hinsichtlich des Speichers verhält. Das Manual sagt, dass eine Variable gelöscht wird. Was nicht erwähnt wird ist, ob auch der Speicher deallokiert wird. Im Source-Code finde ich leider nichts über die unset()-Funktion, oder ich bin einfach zu blind.

Hat jemand Rat?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.10.2007, 18:11  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard Re: Speicherhandling PHP

Interessante Frage, scheint wirklich wieder freigegeben zu werden, wobei ein kleiner Overhead bleibt, zumindest wenn ich die Ausgabe richtig interpretiere:

PHP-Code:
<?php
$before 
memory_get_usage();
$newVar = <<<TEST

phpfriend.de - Die freundschaftliche PHP-Community
    
 SuchenSuchen  FAQFAQ  MitgliederlisteMitgliederliste  ImpressumImpressum
 ProfilProfil   PNDu hast keine neuen Nachrichten   Logout [ Zergling ]Logout [ Zergling ] 
    


Speicherhandling PHP

 
Neues Thema eröffnen   Neue Antwort erstellen      phpfriend.de Foren-Übersicht -> PHP - Anfänger   
Vorheriges Thema anzeigen: $_FILES Problem
Nächstes Thema anzeigen: Es gibt keine neueren Themen in diesem Forum.  
Autor   Nachricht
dr.e.
phpfriend.de-Moderator


Anmeldedatum: 03.12.2004
Beiträge: 870
Wohnort: München
    
Neuer BeitragVerfasst am: 24.10.2007, 17:43    Titel: Speicherhandling PHP  Antworten mit Zitat Beitrag bearbeiten oder löschen Beitrag löschen IP-Adresse zeigen
Hallo zusammen,

wir rätseln grade, wie sich PHP bei einem unset() hinsichtlich des Speichers verhält. Das Manual sagt, dass eine Variable gelöscht wird. Was nicht erwähnt wird ist, ob auch der Speicher deallokiert wird. Im Source-Code finde ich leider nichts über die unset()-Funktion, oder ich bin einfach zu blind.

Hat jemand Rat?
_________________
Grüße,
Dr.E.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Searching for a php framework that rocks?
Have a look at http://www.adventure-php-framework.org!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Nach oben   
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AddThis Social Bookmark Button       
sofort antworten
                            

Very Happy Smile Sad Surprised Shocked Confused Cool Laughing Mad Razz Embarassed Crying or Very sad Evil or Very Mad Twisted Evil Rolling Eyes Wink Exclamation Question Idea Arrow Neutral Mr. Green
Optionen
Letzte Nachricht beantworten
Signatur anhängen (Signatur kann im Profil geändert werden)
Benachrichtigt mich, wenn eine Antwort geschrieben wurde

 
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen      phpfriend.de Foren-Übersicht -> PHP - Anfänger   Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1
Bei Antworten zu diesem Thema benachrichtigen

Thema löschen Thema verschieben Thema sperren Thema teilen      
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum bearbeiten.
Du kannst deine Beiträge in diesem Forum löschen.
Du kannst an Umfragen in diesem Forum mitmachen.
Du kannst dieses Forum moderieren.



Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.


Powered by phpBB © 2001, 2005 phpBB Group


Home | Forum | Tutorials | 1&1 Webhosting | 1&1 DSL | Site Map | Impressum

phpfriend.de wird unterstützt von gmfmedien

TEST;
$between memory_get_usage();
unset(
$newVar);
$afterwards memory_get_usage();

var_dump($before0$between $before$afterwards $before);
?>
Code:
int(62096) int(0) int(2904) int(160)

Edit 1:
Hm andererseits, wenn man memory_get_usage(TRUE) verwendet, kommt
Code:
int(262144) int(0) int(0) int(0)
raus, was die ganze Erkenntnis wieder in Frage stellt.
Was ist schon $real_usage?!


Edit 2: Andererseits im Beispiel auf memory_get_usage() wird auch unset() angeführt, wenn das nicht nur ein ahnungsloser Doku-Sklave geschrieben hat, könnte man das so interpretieren, dass unset() tatsächlich den Speicher freigibt. Ich denke PHP ist weit genug entwickelt, das zu tun, es wäre zumindest sinnvoll.
Zergling-new ist offline  
Alt 24.10.2007, 20:49  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

die unset funktion befindet sich, wie die meisten language constructs, in zend/zend_compile.c.

da ich ziemlich wenig ahnung von c habe, musst du den rest allerdings selbst rausfinden.....

unset:

Code:
void zend_do_unset(znode *variable TSRMLS_DC)
{
	zend_op *last_op;

	zend_check_writable_variable(variable);

	if (variable->op_type == IS_CV) {
		zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
		opline->opcode = ZEND_UNSET_VAR;
		opline->op1.op_type = IS_CONST;
		opline->op1.u.constant.type = IS_STRING;
		opline->op1.u.constant.value.str.len = CG(active_op_array)->vars[variable->u.var].name_len;
		opline->op1.u.constant.value.str.val = estrdup(CG(active_op_array)->vars[variable->u.var].name);
		SET_UNUSED(opline->op2);
		opline->op2.u.EA.type = ZEND_FETCH_LOCAL;
		SET_UNUSED(opline->result);
	} else {
		last_op = &CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1];

		switch (last_op->opcode) {
			case ZEND_FETCH_UNSET:
				last_op->opcode = ZEND_UNSET_VAR;
				break;
			case ZEND_FETCH_DIM_UNSET:
				last_op->opcode = ZEND_UNSET_DIM;
				break;
			case ZEND_FETCH_OBJ_UNSET:
				last_op->opcode = ZEND_UNSET_OBJ;
				break;

		}
	}
}
über zend_opcode.c gehts dann, so wie ich das sehe, in zend_hash.c:

Code:
ZEND_API void zend_hash_clean(HashTable *ht)
{
	Bucket *p, *q;

	IS_CONSISTENT(ht);

	SET_INCONSISTENT(HT_CLEANING);

	p = ht->pListHead;
	while (p != NULL) {
		q = p;
		p = p->pListNext;
		if (ht->pDestructor) {
			ht->pDestructor(q->pData);
		}
		if (q->pData != &q->pDataPtr) {
			pefree(q->pData, ht->persistent);
		}
		pefree(q, ht->persistent);
	}
	memset(ht->arBuckets, 0, ht->nTableSize*sizeof(Bucket *));
	ht->pListHead = NULL;
	ht->pListTail = NULL;
	ht->nNumOfElements = 0;
	ht->nNextFreeElement = 0;
	ht->pInternalPointer = NULL;

	SET_INCONSISTENT(HT_OK);
}
naja bei zend.com gibts noch: http://www.zend.com/apidoc/zend.layo...management.php
brian johnson ist offline  
Alt 24.10.2007, 21:59  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Danke erstmal. Das Codesnipet hatte ich beim grepen auch schon gesehen, aber weitergeklickt. So wie ich den Code verstehe wird schon ein pefree() aufgerufen, allerdings verwirren mich die Konstrukte

Code:
   memset(ht->arBuckets, 0, ht->nTableSize*sizeof(Bucket *));
   ht->pListHead = NULL;
   ht->pListTail = NULL;
   ht->nNumOfElements = 0;
   ht->nNextFreeElement = 0;
   ht->pInternalPointer = NULL;
ein wenig, weil da irgendwas auf NULL gesetzt wird. So tief bin ich dann aber leider nicht im C-Code von PHP bewandert um zu verstehen, wie die Structs hier Einfluss auf die Runtime haben.

Eine Recherche auf zend.com hat mich leider auch nicht weitergebracht. Allerdings scheint "ht" der interne Hashtable von Variablen und Objekten, die während der Laufzeit verwendet werden zu sein.

Für weitere Anregungen / Infomationen bin ich dankbar!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 24.10.2007, 22:43  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

interessant ist noch> http://www.hardened-php.net/hphp/zen...erability.html
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline  
Alt 24.10.2007, 22:55  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Interessante Information zu den Hashtables (und dem PHP-Bug ). Danke!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 06.11.2007, 12:59  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

und was gefunden?

was mich noch interessiern würde, wäre ob variablen innerhalb von funktionen nach ende der funktion aus dem speicher gelöscht würden....
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline  
Alt 06.11.2007, 14:37  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo brian johnson,

es werden explizit die Referenzen aus dem PHP-Hash-Table gelöscht. Rein vom Verständnis sollte damit auch Speicher freigegeben werden.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 06.11.2007, 15:05  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von dr.e.
Hallo brian johnson,

es werden explizit die Referenzen aus dem PHP-Hash-Table gelöscht. Rein vom Verständnis sollte damit auch Speicher freigegeben werden.
eigentlich schon ja....gut danke!
brian johnson ist offline  
Alt 01.11.2009, 13:39  
Benutzer
 
Registriert seit: 17.06.2009
Beiträge: 97
PHP-Kenntnisse:
Fortgeschritten
hondatuner befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
TEST;
$between = memory_get_usage();
unset($newVar);
$afterwards = memory_get_usage();

var_dump($before, 0, $between - $before, $afterwards - $before);
?>[/php]

Code:
int(62096) int(0) int(2904) int(160)

Edit 1:
Hm andererseits, wenn man memory_get_usage(TRUE) verwendet, kommt
Code:
int(262144) int(0) int(0) int(0)
raus, was die ganze Erkenntnis wieder in Frage stellt.
Was ist schon $real_usage?!
Ich finde im Netz leider nichts zu dem Parameter $real_usage, daher diese alte Thread.

Ich dachte es könnte der Peak sein, allerdings stimmt das ja auch nicht, weil bei peak kann man ja auch $real_usage unterstützt.

Welchen Wert sollte man bei der Auswertung seiner Scripte heranziehen. $real_usage oder ohne?

Gruß
__________________
meine PHP Scripte
hondatuner ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php speicher freigeben, php speicher leeren, http://www.php.de/php-tipps-2008/44996-speicherhandling-php.html, php 5.2 speicher freigeben, php speicher löschen, php memory_get_usage, hashtable php, memory_get_usage, php varibale speicher freigeben, memory_get_usage leeren, phhp speicherhandling, memory_get_usage geht nicht, php tabelle aus speicher löschen, ajax seite speicher freigeben, php hashtable var_dump, php memory_get_usage leeren?, speicher frei geben php, php variable speicher freigeben, pefree php, php zend speicher freigeben

Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.