Si el real_usage
argumento se establece en true
PHP DOCS, digamos que obtendrá el tamaño real de la memoria asignada del sistema. Si lo es false
, obtendrá la memoria informada poremalloc()
¿Cuál de estas 2 opciones devuelve el máx. memoria asignada en relación con el valor límite de memoria en php.ini?
Quiero saber qué tan cerca estuvo el guión de alcanzar ese límite.
php
memory
memory-management
thelolcat
fuente
fuente
Respuestas:
Ok, probemos esto usando un script simple:
Salida:
Parece que el uso real es la memoria asignada desde el sistema, que parece asignarse en depósitos más grandes que los que necesita actualmente el script. (Supongo que por razones de rendimiento). Esta es también la memoria que usa el proceso php.
El
$real_usage = false
uso es el uso de memoria que realmente usó en su script, no la cantidad real de memoria asignada por el administrador de memoria de Zend.Lea esta pregunta para obtener más información.
En resumen: para saber qué tan cerca está del límite de memoria, use
$real_usage = true
fuente
if (segment_size < true_size || heap->real_size + segment_size > heap->limit) { /* Memory limit overflow */
.emalloc
(más bytes para encabezados y alineación de memoria). No refleja el desperdicio de memoria debido a que los bloques no encajan en el espacio restante en los segmentos ya asignados. Si cambia su ejemplo para asignar (1024 * 256) bytes y un límite de 2M, la diferencia de dos se hará más evidente.memory_get_usage(true)
valor de las devoluciones que se debe comparar amemory_limit
. El ejemplo dado en la respuesta es demasiado simple ya que no hay "memoria desperdiciada". Lo que sucede es que la memoria asignada "real" debe aumentarse de "1 MiB" a "1.25 MiB" y eso es lo que desencadena el error fatal . Tengo un script por lotes complejo con un límite de memoria de 120 MiB que tiene una memoria asignada "no real" de solo "80 MiB" cuando se cancela porque la memoria asignada "real" alcanza el límite.Introducción
Debe usar
memory_get_usage(false)
porque lo que quiere es memoria usada, no memoria asignada.Cual es la diferencia
Tu
Google Mail
podrías haber asignado25MB
espacio de almacenamiento para usted, pero eso no significa que sea lo que ha utilizado en este momento.Esto es exactamente lo que decía el documento PHP
Ambos argumentos devolverían la memoria asignada en relación con el límite de memoria, pero la principal diferencia es:
memory_get_usage(false)
dar la memoria utilizada poremalloc()
mientrasmemory_get_usage(true)
devuelve el hito que se puede demostrar aquí Memory Mile StoreQuiero saber qué tan cerca estuvo el guión de alcanzar ese límite.
Eso requeriría algunas matemáticas y podría funcionar solo en bucles o casos de uso específicos. ¿Por qué dije eso?
Imagina
The above script would fail before you even get the chance to start start checking memory
.Hasta donde yo sé, la única forma en que puedo verificar la memoria utilizada para una variable o sección específica de PHP es:
Consulte la Explicación , pero si está en un bucle o en una función recursiva, puede usar el uso máximo de memoria para estimar de manera segura cuándo se alcanzaría el punto máximo de memoria.
Ejemplo
Salida
Demo en vivo
Esto todavía puede fallar
Puede fallar porque después de
if ($percentage > $peekPoint) {
esto todavía se agrega para hacer una tarea adicional con también consume memoriaIf the memory to process this request is grater than the memory available the script would fail.
Conclusión
No es una solución perfecta, pero verifique la memoria a intervalos y si excede la vista (por ejemplo, 90%) al
exit
instante y deje las cosas elegantesfuente
memory_limit
opción sobre el montón? o apilar?real_usage
false informa el uso que utilizó su script . Este será el más preciso de los dos.real_usage
true informa la memoria asignada a su script. Este será el más alto de los dos.Probablemente lo usaría
true
si estuviera tratando de comparar, ya que a su script nunca se le asignará más que el límite de memoria y continuará ejecutándose siempre que (más todos los demás scripts) no exceda ese uso.fuente
false
es la memoria que usa el script ,true
es la memoria asignada .según PHP memory_get_usage
por lo que para obtener la memoria utilizada por su script, debe usar memory_get_usage () ya que real_usage predeterminado es falso.
si desea obtener la memoria asignada por el sistema pero no le importa cuánto se usó realmente, use memory_get_usage (true);
fuente
fuente