introduction
Vous devriez utiliser memory_get_usage(false)
parce que ce que vous voulez, c'est de la mémoire utilisée et non de la mémoire allouée.
Quelle est la différence
Vous avez Google Mail
peut-être alloué 25MB
du stockage pour vous, mais cela ne signifie pas que c'est ce que vous avez utilisé pour le moment.
C'est exactement ce que disait le doc PHP
Définissez ceci sur TRUE pour obtenir la taille réelle de la mémoire allouée par le système. S'il n'est pas défini ou FALSE, seule la mémoire utilisée par emalloc () est signalée.
Les deux arguments renverraient la mémoire allouée par rapport à la limite de mémoire, mais la principale différence est:
memory_get_usage(false)
donne la mémoire utilisée par emalloc()
while memory_get_usage(true)
renvoie le jalon qui peut être démontré ici Memory Mile Store
Je veux savoir à quel point le script a atteint cette limite.
Cela prendrait quelques calculs et pourrait ne fonctionner que dans des boucles ou des cas d'utilisation spécifiques. Pourquoi ai-je dit cela?
Imaginer
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
.
Autant que je sache, le seul moyen de vérifier la mémoire utilisée pour une variable ou une section spécifique de PHP est:
$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;
Voir l'explication , mais si vous êtes dans une boucle ou une fonction récursive, vous pouvez utiliser l'utilisation maximale de la mémoire pour estimer en toute sécurité quand l'aperçu de la mémoire serait atteint.
Exemple
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
}
Production
Stoped at: 95.86%
{
"HIGHEST_MEMORY": "0.71",
"HIGHEST_DIFF": "0.24",
"PERCENTAGE_BREAK": "95.86%",
"AVERAGE": "0.04",
"LOOPS": 11
}
Démo en direct
Cela peut encore échouer
Cela peut échouer car après if ($percentage > $peekPoint) {
cela, ajoutez encore à faire une tâche supplémentaire avec consomme également de la mémoire
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.
Conclusion
Ce n'est pas une solution parfaite, mais vérifiez la mémoire à intervalle et si elle dépasse exit
instantanément (par exemple 90%) et laissez les trucs fantaisistes