array - Größe im Speicher eines Objekts in PHP erhalten?



php serialize object to json (4)

Da Klon (aus der Antwort von Prof83 ) nicht für mich funktionierte, habe ich versucht, die Variable, deren Größe ich messen möchte, zu serialisieren und zu deserialisieren:

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

Ich denke, es berichtet bessere Ergebnisse, zumindest für mich.

https://src-bin.com

Es gibt eine Möglichkeit, den Gesamtspeicherbedarf von PHP zu ermitteln ( memory_get_usage() ), aber wie erhält man die Speichergröße eines einzelnen Objekts?

Ich spreche offensichtlich nicht über count() da ich die Anzahl der Bytes in einer potenziell komplexen Datenstruktur haben möchte.


Answer #1

Ich denke nicht, dass das möglich ist; Ich habe noch nie etwas gesehen, mit dem Sie die Größe eines Objekts im Speicher finden könnten.

Eine Lösung, um eine ziemlich grobe Idee zu bekommen, könnte darin bestehen, Ihre Daten zu serialisieren und Strlen zu verwenden ... Aber das wird wirklich eine Art Schätzung sein ... Ich würde mich auf so etwas eigentlich nicht verlassen. ..

Selbst debug_zval_dump macht das nicht: es gibt die Daten in einer Variablen und dem Refcount aus, aber nicht den verwendeten Speicher:

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

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

werde dich nur bekommen:

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

Answer #2

Wäre es nicht sinnvoll, das Objekt zu serialisieren und die Stringlänge zu lesen? Offensichtlich wird es einige Bytes aus sein, weil die serialisierte Zeichenkette s hätte: 'string' deshalb s: '' sind zusätzliche Bytes ... es sei denn, die Serialisierung könnte genauso sein, wie PHP Objekte speichert.

so zum Beispiel

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

Nur ein Gedanke?

Ein weiterer chaotischer aber möglicherweise genauer Gedanke:

Angenommen, es handelt sich um eine Klasseninstanzvariable, die seit der Instanziierung einige Male manipuliert wurde:

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

$ mem könnte die genaue Menge an Speicher sein, die $ DB zugewiesen ist;


Answer #3

Wenn Sie nur die Größe des Objekts und nicht Ihren nächsten Code wissen möchten, return es an den Browser zurück, und Sie können sehen, wie stark das Netzwerk das Objekt überträgt.





size