Gibt es eine Funktion in PHP (oder einer PHP-Erweiterung), um herauszufinden, wie viel Speicher eine bestimmte Variable verwendet? sizeof
sagt mir nur die Anzahl der Elemente / Eigenschaften.
memory_get_usage
hilft dabei, dass es mir die Speichergröße gibt, die vom gesamten Skript verwendet wird. Gibt es eine Möglichkeit, dies für eine einzelne Variable zu tun?
Beachten Sie, dass sich dies auf einem Entwicklungscomputer befindet, sodass das Laden von Erweiterungen oder Debug-Tools möglich ist.
Antworten:
Sie benötigen wahrscheinlich einen Speicherprofiler. Ich habe Informationen für SO gesammelt, aber ich habe einige wichtige Dinge kopiert, die Ihnen auch helfen können.
Wie Sie wahrscheinlich wissen, hat Xdebug die Unterstützung für Speicherprofile seit der 2. * -Version eingestellt. Bitte suchen Sie hier nach der Zeichenfolge "entfernte Funktionen": http://www.xdebug.org/updates.php
Andere Profiler-Optionen
PHP-Speicher-Profiler
https://github.com/arnaud-lb/php-memory-profiler . Folgendes habe ich auf meinem Ubuntu-Server getan, um es zu aktivieren:
Und dann in meinem Code:
Öffnen Sie schließlich die
callgrind.out
Datei mit KCachegrindVerwendung von Google Gperftools (empfohlen!)
Installieren Sie zunächst die Google Gperftools, indem Sie das neueste Paket hier herunterladen: https://code.google.com/p/gperftools/
Dann wie immer:
Jetzt in Ihrem Code:
Öffnen Sie dann Ihr Terminal und starten Sie:
pprof erstellt in Ihrer vorhandenen Browsersitzung ein neues Fenster mit den folgenden Angaben :
Xhprof + Xhgui (meiner Meinung nach das Beste, um sowohl CPU als auch Speicher zu profilieren)
Mit Xhprof und Xhgui können Sie auch die CPU-Auslastung oder nur die Speichernutzung profilieren, wenn dies momentan Ihr Problem ist. Es ist eine sehr vollständige Lösung, es gibt Ihnen die volle Kontrolle und die Protokolle können sowohl auf Mongo als auch im Dateisystem geschrieben werden.
Weitere Details finden Sie hier .
Schwarzes Feuer
Blackfire ist ein PHP-Profiler von SensioLabs, den Symfony2-Jungs https://blackfire.io/
Wenn Sie Ihre virtuelle Maschine mit puphpet einrichten, werden Sie froh sein zu wissen, dass sie unterstützt wird ;-)
Xdebug- und Tracing-Speichernutzung
XDEBUG2 ist eine Erweiterung für PHP. Mit Xdebug können Sie alle Funktionsaufrufe einschließlich Parameter und Rückgabewerte in einer Datei in verschiedenen Formaten protokollieren. Es gibt drei Ausgabeformate. Eine ist als von Menschen lesbare Ablaufverfolgung gedacht, eine andere eignet sich besser für Computerprogramme, da sie einfacher zu analysieren ist, und die letzte verwendet HTML zum Formatieren der Ablaufverfolgung. Mit der Einstellung können Sie zwischen den beiden verschiedenen Formaten wechseln. Ein Beispiel wäre hier verfügbar
für P
forp einfacher, nicht aufdringlicher, produktionsorientierter PHP-Profiler. Einige der Funktionen sind:
Messung der Zeit und des zugewiesenen Speichers für jede Funktion
CPU auslastung
Datei- und Zeilennummer des Funktionsaufrufs
Ausgabe als Trace-Ereignisformat von Google
Beschriftung von Funktionen
Gruppierung von Funktionen
Aliase von Funktionen (nützlich für anonyme Funktionen)
DBG
DBG ist ein voll funktionsfähiger PHP-Debugger, ein interaktives Tool, mit dem Sie PHP-Skripte debuggen können. Es funktioniert auf einem Produktions- und / oder Entwicklungs-WEB-Server und ermöglicht es Ihnen, Ihre Skripte lokal oder remote über eine IDE oder Konsole zu debuggen. Folgende Funktionen stehen zur Verfügung:
Remote- und lokales Debugging
Explizite und implizite Aktivierung
Aufrufstapel, einschließlich Funktionsaufrufe, dynamische und statische Methodenaufrufe, mit ihren Parametern
Navigation durch den Aufrufstapel mit der Möglichkeit, Variablen an entsprechenden (verschachtelten) Stellen auszuwerten
Step in / Step out / Step over / Run to Cursor-Funktionalität
Bedingte Haltepunkte
Globale Haltepunkte
Protokollierung auf Fehler und Warnungen
Mehrere gleichzeitige Sitzungen zum parallelen Debuggen
Unterstützung für GUI- und CLI-Frontends
IPv6- und IPv4-Netzwerke werden unterstützt
Alle vom Debugger übertragenen Daten können optional mit SSL geschützt werden
quelle
Es gibt keine direkte Möglichkeit, die Speichernutzung einer einzelnen Variablen zu ermitteln, aber wie Gordon vorgeschlagen hat, können Sie diese verwenden
memory_get_usage
. Dadurch wird die Gesamtmenge des zugewiesenen Speichers zurückgegeben, sodass Sie eine Problemumgehung verwenden und die Nutzung vorher und nachher messen können, um die Nutzung einer einzelnen Variablen abzurufen. Das ist ein bisschen hacky, aber es sollte funktionieren.Beachten Sie, dass dies in keiner Weise eine zuverlässige Methode ist. Sie können nicht sicher sein, dass beim Zuweisen der Variablen nichts anderes den Speicher berührt. Daher sollte dies nur als Annäherung verwendet werden.
Sie können dies tatsächlich in eine Funktion umwandeln, indem Sie eine Kopie der Variablen innerhalb der Funktion erstellen und den verwendeten Speicher messen. Ich habe das noch nicht getestet, aber im Prinzip sehe ich nichts falsch daran:
quelle
$tmp = $var
erstellt eine flache Kopie. Dadurch wird nicht mehr Speicher zugewiesen, bis $ tmp geändert wird.$tmp = unserialize(serialize($var))
; Dies würde Aistinas obigen Ansatz kombinieren.$var
es sich bereits um eine flache Kopie oder Referenz handelt, die an die Funktion übergeben wurde, benötigen Sie diese nicht$tmp
, können sie jedoch neu zuweisen$var
. Dies speichert die interne Referenz von$tmp
bis$var
.$tmp
aus$var
?Nein, da ist kein. Sie können das Ergebnis jedoch auf eine Annäherung
serialize($var)
überprüfenstrlen
.quelle
strlen(serialize(array(1,2,3)))
ist 30.Als Antwort auf Tatu Ulmanens Antwort:
Es ist zu beachten, dass
$start_memory
selbst Speicher belegt wird (PHP_INT_SIZE * 8
).So sollte die ganze Funktion werden:
Es tut mir leid, dies als zusätzliche Antwort hinzuzufügen, aber ich kann eine Antwort noch nicht kommentieren.
Update: Die * 8 ist nicht definitiv. Es kann anscheinend von der PHP-Version und möglicherweise von 64/32 Bit abhängen.
quelle
* 8
? Vielen Dank!PHP_INT_SIZE
Bytes, sondern auch belegtPHP_INT_SIZE*8
. Sie können versuchen , dass durch diese Funktion aufrufen, sollte es zurückgeben 0:function sizeofvar() { $start_memory = memory_get_usage(); return memory_get_usage() - $start_memory - PHP_INT_SIZE*8; }
8
scheint nicht konstant zu sein. Nach Ihrer Kommentarfunktion auf meinem Entwicklungssystem (PHP 5.6.19) wird es zurückgegeben-16
. Interessanterweise ergeben sich aus demphp -a
Aufruf der beiden Zeilen der Funktion verschiedene unterschiedliche Werte.Sehen:
memory_get_usage()
- Gibt die dem PHP zugewiesene Speichermenge zurückmemory_get_peak_usage()
- Gibt die von PHP zugewiesene Speicherspitze zurückBeachten Sie, dass Sie dadurch nicht die Speichernutzung einer bestimmten Variablen erhalten. Sie können diese Funktion jedoch vor und nach dem Zuweisen der Variablen aufrufen und dann die Werte vergleichen. Das sollte Ihnen eine Vorstellung von dem verwendeten Speicher geben.
Sie können sich auch die PECL-Erweiterung Memtrack ansehen , obwohl die Dokumentation etwas fehlt, wenn nicht sogar praktisch nicht vorhanden ist.
quelle
Sie können die Speicherdifferenz für einen Rückrufrückgabewert berechnen. Es ist eine elegantere Lösung, die in PHP 5.3+ verfügbar ist.
quelle
Sie können den genauen Footprint einer Variablen nicht nachträglich berechnen, da zwei Variablen denselben zugewiesenen Speicherplatz im Speicher gemeinsam nutzen können
Versuchen wir, den Speicher zwischen zwei Arrays zu teilen. Wir sehen, dass das Zuweisen des zweiten Arrays die Hälfte des Speichers des ersten Arrays kostet. Wenn wir den ersten deaktivieren, wird fast der gesamte Speicher noch vom zweiten verwendet.
Wir können also nicht schließen, dass das zweite Array die Hälfte des Speichers verwendet, da es falsch wird, wenn wir das erste deaktivieren.
Um einen vollständigen Überblick darüber zu erhalten, wie der Speicher in PHP zugewiesen wird und für welche Verwendung, empfehle ich Ihnen, den folgenden Artikel zu lesen: Wie groß sind PHP-Arrays (und -Werte) wirklich? (Hinweis: GROSS!)
Die Grundlagen der Referenzzählung in der PHP-Dokumentation enthalten auch viele Informationen zur Speichernutzung, und Referenzen zählen für gemeinsam genutzte Datensegmente.
Die verschiedenen hier vorgestellten Lösungen sind gut für Annäherungen, aber keine kann die subtile Verwaltung des PHP-Speichers bewältigen.
Wenn Sie den neu zugewiesenen Speicherplatz nach einer Zuweisung verwenden möchten, müssen Sie ihn
memory_get_usage()
vor und nach der Zuweisung verwenden, da die Verwendung mit einer Kopie eine fehlerhafte Ansicht der Realität ergibt.Denken Sie daran, dass, wenn Sie das Ergebnis des ersten speichern möchten
memory_get_usage()
, die Variable bereits vorher vorhanden sein muss und einmemory_get_usage()
anderes vorheriges Mal aufgerufen werden muss, sowie jede andere Funktion auch.Wenn Sie wie im obigen Beispiel Echo wiedergeben möchten, muss Ihr Ausgabepuffer bereits geöffnet sein, um zu vermeiden, dass der zum Öffnen des Ausgabepuffers erforderliche Abrechnungsspeicher benötigt wird.
Wenn Sie sich auf eine Funktion verlassen möchten, um den erforderlichen Speicherplatz zum Speichern einer Kopie einer Variablen zu berechnen, werden im folgenden Code verschiedene Optimierungen vorgenommen:
Beachten Sie, dass die Größe des Variablennamens im zugewiesenen Speicher von Bedeutung ist.
Eine Variable hat eine Grundgröße, die durch die im PHP-Quellcode verwendete innere C-Struktur definiert wird. Diese Größe schwankt bei Zahlen nicht. Bei Zeichenfolgen wird die Länge der Zeichenfolge hinzugefügt.
Wenn wir die Initialisierung des Variablennamens nicht berücksichtigen, wissen wir bereits, wie viel eine Variable verwendet (bei Zahlen und Zeichenfolgen):
(Diese Zahlen können sich je nach PHP-Version ändern.)
Aufgrund der Speicherausrichtung müssen Sie auf ein Vielfaches von 4 Bytes aufrunden. Befindet sich die Variable im globalen Bereich (nicht innerhalb einer Funktion), werden 64 weitere Bytes zugewiesen.
Wenn Sie also einen der Codes auf dieser Seite verwenden möchten, müssen Sie anhand einiger einfacher Testfälle (Zeichenfolgen oder Zahlen) überprüfen, ob das Ergebnis mit diesen Daten übereinstimmt, wobei alle Angaben in diesem Beitrag berücksichtigt werden ($ _GLOBAL-Array, erster Funktionsaufruf, Ausgabepuffer, ...)
quelle
zvalue
,is_ref
und Copy-on-Write. Danke dir.Ich hatte ein ähnliches Problem, und die Lösung, die ich verwendete, bestand darin, die Variable in eine Datei zu schreiben und dann filesize () darauf auszuführen. Ungefähr so (ungetesteter Code):
Diese Lösung ist nicht besonders schnell, da es sich um Festplatten-E / A handelt, aber sie sollte Ihnen etwas viel Genaueres bieten als die Tricks memory_get_usage. Es kommt nur darauf an, wie viel Präzision Sie benötigen.
quelle
strlen
einfacher wäre.Nie versucht, aber Xdebug-Traces mit xdebug.collect_assignment s können ausreichen.
quelle
quelle
Das folgende Skript zeigt die gesamte Speichernutzung einer einzelnen Variablen.
Überprüfen Sie dies heraus
http://www.phpzag.com/how-much-memory-do-php-variables-use/
quelle