Si l' real_usage
argument est défini sur true
PHP DOCS, dites qu'il obtiendra la taille réelle de la mémoire allouée par le système. Si c'est le cas false
, la mémoire sera signalée paremalloc()
Laquelle de ces 2 options renvoie le max. mémoire allouée par rapport à la valeur de limite de mémoire dans php.ini?
Je veux savoir à quel point le script a atteint cette limite.
php
memory
memory-management
thelolcat
la source
la source
Réponses:
Ok, testons cela en utilisant un script simple:
Production:
On dirait que l'utilisation réelle est la mémoire allouée par le système - qui semble être allouée dans des compartiments plus grands que ce dont le script a actuellement besoin. (Je suppose que pour des raisons de performances). C'est également la mémoire utilisée par le processus php.
L'
$real_usage = false
utilisation est l'utilisation de la mémoire que vous avez réellement utilisée dans votre script, pas la quantité réelle de mémoire allouée par le gestionnaire de mémoire de Zend.Lisez cette question pour plus d'informations.
En bref: pour vous rapprocher de la limite de mémoire, utilisez
$real_usage = true
la source
if (segment_size < true_size || heap->real_size + segment_size > heap->limit) { /* Memory limit overflow */
.emalloc
(plus les octets pour les en-têtes et l'alignement de la mémoire). Il ne reflète pas le gaspillage de mémoire en raison de blocs ne s'insérant pas dans l'espace restant dans les segments déjà alloués. Si vous modifiez votre exemple pour allouer (1024 * 256) octets et une limite de 2M, la différence de deux deviendra plus apparente.memory_get_usage(true)
valeur de retour qui devrait être comparé àmemory_limit
. L'exemple donné dans la réponse est bien trop simple car il n'y a pas de "mémoire" gaspillée. Ce qui se passe, c'est que la "vraie" mémoire allouée doit être augmentée de "1 MiB" à "1,25 MiB" et c'est ce qui déclenche l'erreur fatale J'ai un script batch complexe avec une limite de mémoire de 120 Mio qui ont une mémoire allouée "pas réelle" de seulement "80 Mio" quand elle est abandonnée parce que la mémoire allouée "réelle" atteint la limite.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
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 paremalloc()
whilememory_get_usage(true)
renvoie le jalon qui peut être démontré ici Memory Mile StoreJe 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
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:
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
Production
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émoireIf 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 fantaisistesla source
memory_limit
option concerne-t-elle le tas? ou pile?real_usage
false signale l'utilisation que votre script a utilisée . Ce sera le plus précis des deux.real_usage
true rapporte la mémoire allouée à votre script. Ce sera le plus élevé des deux.J'utiliserais probablement
true
si j'essayais de comparer, car votre script ne serait jamais alloué plus que la limite de mémoire et continuerait à fonctionner tant qu'il (ainsi que tous les autres scripts) ne dépasserait pas cette utilisation.la source
false
est la mémoire utilisée par le script ,true
est la mémoire allouée .selon PHP memory_get_usage
donc pour obtenir la mémoire utilisée par votre script, vous devez utiliser memory_get_usage () par défaut, real_usage est false.
si vous souhaitez obtenir la mémoire allouée par le système mais que vous ne vous souciez pas de la quantité réellement utilisée, utilisez memory_get_usage (true);
la source
la source