| | | | |
| | |
| Moderator und Wett-König | 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! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Erfahrener Benutzer Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse: Fortgeschritten ![]() | 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;
}
}
}
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);
}
|
| |
| | |
| Moderator und Wett-König | 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; 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! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| | |
| Erfahrener Benutzer Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse: Fortgeschritten ![]() | interessant ist noch> http://www.hardened-php.net/hphp/zen...erability.html |
| |
| | |
| Moderator und Wett-König | Interessante Information zu den Hashtables (und dem PHP-Bug
__________________ 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! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| | |
| Moderator und Wett-König | 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! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| | ||
| Benutzer Registriert seit: 17.06.2009
Beiträge: 97
PHP-Kenntnisse: Fortgeschritten ![]() | Zitat:
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 | |
| |
| Themen-Optionen | |
| Thema bewerten | |
|
|
| 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 |

Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.