2009-08-29 8 views

risposta

15

È possibile chiamare memory_get_usage() prima e dopo l'allocazione della classe come illustrato in this example from IBM. Potresti anche creare un wrapper per farlo, possibilmente memorizzando il risultato su una variabile membro della classe complessa stessa.

EDIT:

Per chiarire la parte che riguarda la memorizzazione la dimensione della memoria allocata, si può fare qualcosa di simile:

class MyBigClass 
{ 
    var $allocatedSize; 
    var $allMyOtherStuff; 
} 

function AllocateMyBigClass() 
{ 
    $before = memory_get_usage(); 
    $ret = new MyBigClass; 
    $after = memory_get_usage(); 
    $ret->allocatedSize = ($after - $before); 

    return $ret; 
} 

In qualsiasi punto, in futuro, si potrebbe verificare allocatedSize per vedere quanto è grande quell'oggetto era al momento dell'allocazione. Se lo si aggiunge dopo averlo distribuito, allocateSize non sarebbe più accurato.

+1

Cosa succede se PHP decide di liberare la memoria che è stata allocata, solo al "momento sbagliato"? Non so davvero quando il PHP libera la memoria (tipo "quando serve", suppongo), ma immagino che questa liberazione potrebbe portare qualche problema? Soprattutto con il garbage collector introdotto da PHP 5.3 per i riferimenti ciclici? –

+0

Beh, sì, ma oltre a ciò che Pascal ha menzionato, voglio essere in grado di scoprirlo in momenti diversi, non solo in fase di allocazione. Voglio trovare questo fuori molte linee lungo la strada. –

+0

@Pascal: PHP non libererà memoria a cui fa comunque riferimento un oggetto attivamente utilizzato. Riferimenti ciclici significa A riferimenti B e B riferimenti A, ma nient'altro fa riferimento ad A o B. Quindi la memoria non verrà liberata fintanto che il programma può comunque farvi riferimento in alcun modo. –

3

Non penso che sia del tutto possibile; Non ho mai visto nulla che ti permetta di ottenere la dimensione di un oggetto in memoria.

Una soluzione per ottenere un'idea abbastanza approssimativa potrebbe essere quella di serializzare i dati e utilizzare strlen su quello ... Ma sarà davvero una stima ... Non farei affidamento su qualcosa come che, in realtà ...


Anche debug_zval_dump non lo fa: è ouput i dati in una variabile e la refcount, ma non la memoria utilizzata:

$obj = new stdClass(); 
$obj->a = 152; 
$obj->b = 'test'; 

echo '<pre>'; 
debug_zval_dump($obj); 
echo '</pre>'; 

solo si ottiene:

object(stdClass)#1 (2) refcount(2){ 
    ["a"]=> 
    long(152) refcount(1) 
    ["b"]=> 
    string(4) "test" refcount(1) 
} 
+0

Molto interessante. La mia prossima domanda riguardava in realtà ottenere dei referti per capire perché c'è una perdita di memoria. Grazie! –

11

Non avrebbe senso provare a serializzare l'oggetto e leggere la lunghezza della stringa? Ovviamente ci saranno molti bytes perché la stringa serializzata avrà s: 'string', quindi s: '' essendo byte extra ... a meno che serialize non possa essere nello stesso modo in cui PHP memorizza gli oggetti ???

così per esempio

$size = strlen(serialize($object)); 

Solo un pensiero?

Un altro pensiero disordinato, ma possibilmente preciso:

Ipotizzando una variabile di istanza di classe che è stato manipolato un paio di volte dal esemplificazione:

$DB; // database access class for eg. 
$mem = memory_get_usage(); 
$DB_tmp = clone $DB; 
$mem = memory_get_usage() - $mem; 
unset($DB_tmp); 

$ mem potrebbe essere l'esatta quantità di memoria allocata a $ DB ;

+0

** clone ** non funziona per me (non so perché). Segnala sempre 100 byte dopo la clonazione di un oggetto. –

1

Dal clone (da Prof83's answer) non ha funzionato per me, ho provato a serializzare e deserializzare la variabile la cui dimensione voglio misurare:

function getMemoryUsage($var) { 
    $mem = memory_get_usage(); 
    $tmp = unserialize(serialize($var)); 
    // Return the unserialized memory usage 
    return memory_get_usage() - $mem; 
} 

Penso che riporta i risultati migliori, almeno per me.

+0

non hai usato la variabile '$ tmp' –

0

Se si desidera conoscere la dimensione dell'oggetto e non il codice successivo, return nel browser, è possibile vedere quanto la rete trasmette l'oggetto .

Problemi correlati