Wenn das real_usage
Argument auf true
PHP DOCS gesetzt ist, wird die tatsächliche Größe des vom System zugewiesenen Speichers abgerufen. Wenn dies der false
Fall ist, wird der Speicher von gemeldetemalloc()
Welche dieser beiden Optionen gibt die max. Speicher relativ zum Speichergrenzwert in php.ini zugewiesen?
Ich möchte wissen, wie nahe das Skript war, um diese Grenze zu erreichen.
php
memory
memory-management
thelolcat
quelle
quelle
Antworten:
Ok, lassen Sie uns dies mit einem einfachen Skript testen:
Ausgabe:
Die tatsächliche Nutzung scheint der vom System zugewiesene Speicher zu sein, der in größeren Buckets zugewiesen zu werden scheint, als derzeit vom Skript benötigt werden. (Ich denke aus Leistungsgründen). Dies ist auch der Speicher, den der PHP-Prozess verwendet.
Die
$real_usage = false
Verwendung ist die Speicherauslastung, die Sie tatsächlich in Ihrem Skript verwendet haben, nicht die tatsächliche Speichermenge, die vom Speichermanager von Zend zugewiesen wurde.Lesen Sie diese Frage für weitere Informationen.
Kurz gesagt: Um zu erreichen, wie nahe Sie an der Speichergrenze sind, verwenden Sie
$real_usage = true
quelle
if (segment_size < true_size || heap->real_size + segment_size > heap->limit) { /* Memory limit overflow */
.emalloc
(plus Bytes für Header und Speicherausrichtung). Es spiegelt nicht den Speicher wider, der aufgrund von Blöcken verschwendet wurde, die nicht in den in bereits zugewiesenen Segmenten verbleibenden Speicherplatz passen. Wenn Sie Ihr Beispiel ändern, um (1024 * 256) Bytes und ein 2M-Limit zuzuweisen, wird der Unterschied zwischen zwei deutlicher.memory_get_usage(true)
Rückgabewert, mit dem verglichen werden sollmemory_limit
. Das Beispiel in der Antwort ist viel zu einfach, da kein "verschwendeter" Speicher "vorhanden ist. Was passiert, ist, dass der" echte "zugewiesene Speicher von" 1 MiB "auf" 1,25 MiB "erhöht werden muss, was den schwerwiegenden Fehler auslöst Ich habe ein komplexes Batch-Skript mit einem Speicherlimit von 120 MiB, das "nicht real" zugewiesenen Speicher von nur "80 MiB" hat, wenn es abgebrochen wird, weil der "real" zugewiesene Speicher das Limit erreicht.Einführung
Sie sollten verwenden,
memory_get_usage(false)
weil Sie Speicher verwenden möchten, nicht Speicher zugewiesen.Was ist der Unterschied
Ihre
Google Mail
Macht hat zugewiesen25MB
Speicher für Sie , aber es bedeutet nicht , dass das , was Sie im Moment verwendet haben.Genau das hat das PHP-Dokument gesagt
Beide Argumente würden den relativ zum Speicherlimit zugewiesenen Speicher zurückgeben, aber der Hauptunterschied ist:
memory_get_usage(false)
Geben Sie den vonemalloc()
while verwendeten Speicher an, der denmemory_get_usage(true)
Meilenstein zurückgibt. Dies kann hier im Memory Mile Store demonstriert werdenIch möchte wissen, wie nahe das Skript war, um diese Grenze zu erreichen.
Das würde einige Mathematik erfordern und möglicherweise nur in Schleifen oder bestimmten Anwendungsfällen funktionieren. Warum habe ich so gesagt?
Vorstellen
The above script would fail before you even get the chance to start start checking memory
.Soweit ich weiß, kann ich den für eine Variable oder einen bestimmten Abschnitt von PHP verwendeten Speicher nur überprüfen:
Siehe Erläuterung . Wenn Sie sich jedoch in einer Schleife oder einer rekursiven Funktion befinden, können Sie die maximale Speichernutzung verwenden, um sicher zu schätzen, wann ein Speicher-Peek erreicht wird.
Beispiel
Ausgabe
Live-Demo
Dies kann immer noch fehlschlagen
Es kann fehlschlagen, da danach
if ($percentage > $peekPoint) {
noch noch zusätzliche Aufgaben zu erledigen sind, die ebenfalls Speicher verbrauchenIf the memory to process this request is grater than the memory available the script would fail.
Fazit
Es ist keine perfekte Lösung, aber prüfen Sie in regelmäßigen Abständen, ob Speicher vorhanden ist, und prüfen Sie
exit
sofort, ob der Blick größer ist (z. B. 90%), und lassen Sie das schicke Zeug zurückquelle
memory_limit
Option über Haufen? oder stapeln?real_usage
falsche Berichte die Verwendung Ihr Skript verwendet . Dies wird die genauere von beiden sein.real_usage
true meldet den Ihrem Skript zugewiesenen Speicher . Dies wird der höhere von beiden sein.Ich würde es wahrscheinlich verwenden,
true
wenn ich versuchen würde zu vergleichen, da Ihrem Skript niemals mehr als das Speicherlimit zugewiesen würde und es weiterhin ausgeführt würde, solange es (plus alle anderen Skripte) diese Verwendung nicht überschreitet.quelle
false
Ist der Speicher, den das Skript verwendet ,true
ist der Speicher zugewiesen .gemäß PHP memory_get_usage
Um den von Ihrem Skript verwendeten Speicher zu erhalten, sollten Sie memory_get_usage () verwenden, da standardmäßig real_usage false ist.
Wenn Sie den vom System zugewiesenen Speicher erhalten möchten, sich aber nicht darum kümmern, wie viel tatsächlich verwendet wurde, verwenden Sie memory_get_usage (true).
quelle
quelle