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 zugewiesen 25MB
Speicher für Sie , aber es bedeutet nicht , dass das , was Sie im Moment verwendet haben.
Genau das hat das PHP-Dokument gesagt
Setzen Sie dies auf TRUE, um die tatsächliche Größe des vom System zugewiesenen Speichers zu erhalten. Wenn nicht gesetzt oder FALSE, wird nur der von emalloc () verwendete Speicher gemeldet.
Beide Argumente würden den relativ zum Speicherlimit zugewiesenen Speicher zurückgeben, aber der Hauptunterschied ist:
memory_get_usage(false)
Geben Sie den von emalloc()
while verwendeten Speicher an, der den memory_get_usage(true)
Meilenstein zurückgibt. Dies kann hier im Memory Mile Store demonstriert werden
Ich 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
ini_set('memory_limit', '1M');
$data = str_repeat(' ', 1024 * 1024);
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:
$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;
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
ini_set('memory_limit', '1M');
$memoryAvailable = filter_var(ini_get("memory_limit"), FILTER_SANITIZE_NUMBER_INT);
$memoryAvailable = $memoryAvailable * 1024 * 1024;
$peekPoint = 90; // 90%
$memoryStart = memory_get_peak_usage(false);
$memoryDiff = 0;
// Some stats
$stat = array(
"HIGHEST_MEMORY" => 0,
"HIGHEST_DIFF" => 0,
"PERCENTAGE_BREAK" => 0,
"AVERAGE" => array(),
"LOOPS" => 0
);
$data = "";
$i = 0;
while ( true ) {
$i ++;
// Get used memory
$memoryUsed = memory_get_peak_usage(false);
// Get Diffrence
$memoryDiff = $memoryUsed - $memoryStart;
// Start memory Usage again
$memoryStart = memory_get_peak_usage(false);
// Gather some stats
$stat['HIGHEST_MEMORY'] = $memoryUsed > $stat['HIGHEST_MEMORY'] ? $memoryUsed : $stat['HIGHEST_MEMORY'];
$stat['HIGHEST_DIFF'] = $memoryDiff > $stat['HIGHEST_DIFF'] ? $memoryDiff : $stat['HIGHEST_DIFF'];
$stat['AVERAGE'][] = $memoryDiff;
$stat['LOOPS'] ++;
$percentage = (($memoryUsed + $stat['HIGHEST_DIFF']) / $memoryAvailable) * 100;
// var_dump($percentage, $memoryDiff);
// Stop your scipt
if ($percentage > $peekPoint) {
print(sprintf("Stoped at: %0.2f", $percentage) . "%\n");
$stat['AVERAGE'] = array_sum($stat['AVERAGE']) / count($stat['AVERAGE']);
$stat = array_map(function ($v) {
return sprintf("%0.2f", $v / (1024 * 1024));
}, $stat);
$stat['LOOPS'] = $i;
$stat['PERCENTAGE_BREAK'] = sprintf("%0.2f", $percentage) . "%";
echo json_encode($stat, 128);
break;
}
$data .= str_repeat(' ', 1024 * 25); // 1kb every time
}
Ausgabe
Stoped at: 95.86%
{
"HIGHEST_MEMORY": "0.71",
"HIGHEST_DIFF": "0.24",
"PERCENTAGE_BREAK": "95.86%",
"AVERAGE": "0.04",
"LOOPS": 11
}
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 verbrauchen
print(sprintf("Stoped at: %0.2f", $percentage) . "%\n");
$stat['AVERAGE'] = array_sum($stat['AVERAGE']) / count($stat['AVERAGE']);
$stat = array_map(function ($v) {
return sprintf("%0.2f", $v / (1024 * 1024));
}, $stat);
$stat['LOOPS'] = $i;
$stat['PERCENTAGE_BREAK'] = sprintf("%0.2f", $percentage) . "%";
echo json_encode($stat, 128);
break;
If 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ück