Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

345
Vistas
Uso de memoria del proceso php

RESUMEN


Recomendaciones breves (a partir de informaciones más detalladas, ver respuestas)

Para evitar pérdidas de memoria, puede:

  1. Desestablecer variables a la vez cuando se vuelven inútiles.
  2. puede usar xdebug para obtener un informe detallado del consumo de memoria por funciones y encontrar fugas de memoria
  3. puede configurar memory_limit (por ejemplo, a 5 Mb) para evitar la asignación de memoria ficticia

PREGUNTA

¿Para qué php puede usar memoria, excepto bibliotecas y variables? Superviso la memoria, utilizada por variables y sus ~ 3Mb con este código:

 $vars = array_keys(get_defined_vars()); $cnt_vars = count($vars); $allsize = 0; for ($j = 0; $j < $cnt_vars; $j++) { try { $size = @serialize($$vars[$j]); $size = strlen($size); } catch(Exception $e){ $str = json_encode($$vars[$j]); $str = str_replace(array('{"','"}','":"','":'), '', $str); $size = strlen($str); } $vars[$j] = array( 'size' => $size, 'name' => $vars[$j] ); $allsize += $size; }

y las bibliotecas ocupan ~ 18 Mb (libcurl, etc.) Así que el total es de 21 Mb, pero

pmap -x (proceso) muestra que el consumo total de memoria es kB: 314028 RSS: 74704 Sucio: 59672

entonces, el consumo real total es ~74Mb. También veo algunos bloques grandes con mapeo [anon] en mi pmap ¿Para qué PHP usa estos bloques?

versión de php: 5.5.9-1ubuntu4.14 extensiones de php:

 root@webdep:~# php -m [PHP Modules] bcmath bz2 calendar Core ctype curl date dba dom ereg exif fileinfo filter ftp gd gettext hash iconv json libxml mbstring mcrypt mhash openssl pcntl pcre PDO pdo_pgsql pgsql Phar posix readline Reflection session shmop SimpleXML soap sockets SPL standard sysvmsg sysvsem sysvshm tokenizer wddx xml xmlreader xmlwriter Zend OPcache zip zlib [Zend Modules] Zend OPcache
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

PHP no es lo mismo que el código C o CPP que se compila en un solo binario. Todos sus scripts se ejecutan dentro de Zend Virtual Machine. Y la mayor parte de la memoria la consume la propia VM. Eso incluye la memoria utilizada por las extensiones cargadas, las bibliotecas compartidas (archivos .so) utilizadas por el proceso PHP y cualquier otro recurso compartido.

No recuerdo la fuente exacta, pero en alguna parte leí que casi el 70% del total de los ciclos de CPU son consumidos por los componentes internos de PHP y solo el 30% llega a su código (corríjame si me equivoco aquí). Esto no está directamente relacionado con el consumo de memoria, pero debería dar una idea de cómo funciona PHP.

Acerca de los bloques anon, encontré algunos detalles en otra respuesta SO. La respuesta es sobre Java, pero lo mismo debería aplicarse a PHP también.

Los bloques Anon son bloques "grandes" asignados a través de malloc o mmap; consulte las páginas de manual. Como tales, no tienen nada que ver con el montón de Java (aparte del hecho de que todo el montón debe almacenarse en dicho bloque).

  • Aquí está el enlace real para la respuesta SO https://stackoverflow.com/a/1483482/1012809

  • Consulte este artículo para obtener más detalles sobre las páginas de memoria anónimas (anon) https://techtalk.intersec.com/2013/07/memory-part-2-understanding-process-memory/

  • Consulte también este Slide-share para obtener más detalles sobre la gestión de memoria PHP http://www.slideshare.net/jpauli/understanding-php-memory

Recomendaría deshabilitar algunas extensiones. Eso debería ahorrarle algo de memoria no utilizada.

over 4 years ago · Santiago Trujillo Denunciar

0

NOTA: esto no es exactamente una respuesta, sino información solicitada por el OP, pero el campo de comentarios es demasiado corto para esto... Estas son más herramientas para depurar este tipo de problemas.

Los documentos de Xdebug son bastante completos , deberían decir cómo usarlo mucho mejor de lo que yo podría copiar sus documentos aquí. La secuencia de comandos que proporcionó es un poco borrosa, por lo que no hice el seguimiento yo mismo, pero le daría diferencias de uso de memoria línea por línea.

Básicamente, configure xdebug.show_mem_delta en 1 con Xdebug habilitado para generar el seguimiento de la función, que luego puede abrir en un editor de texto para ver qué parte es exactamente lo que pierde memoria.

Luego puede comparar la memoria total inicial (o posición intermedia) para ver cuánto difiere del uso de memoria real que está viendo.

 TRACE START [2007-05-06 14:37:26] 0.0003 114112 +114112 -> {main}() ../trace.php:0

Aquí la memoria total sería la 114112 .

Si la diferencia es realmente grande, es posible que desee usar algo como shell_exec() para obtener el uso de memoria real entre todas las líneas y generar eso, y luego puede comparar esa salida con la salida de memoria de Xdebug para ver dónde ocurre la diferencia.

Si la diferencia es desde la primera línea del script, el culpable podría ser una extensión de PHP. Vea php -m si hay alguna extensión sospechosa.

over 4 years ago · Santiago Trujillo Denunciar

0

En primer lugar, haga una matriz, para investigar la memoria que está tomando

 $startMemory = memory_get_usage(); $array = range(1, 100000); echo memory_get_usage() - $startMemory, ' bytes';

un entero es 8 bytes (en una 64 bit unix machine y usando el tipo long ) y aquí 100000 integers , por lo que obviamente necesitará 800000 bytes . Eso es algo así como 0.76 MB .

Esta matriz da 14649024 bytes . Eso es 13.97 MB , dieciocho veces más de lo estimado .

Aquí hay un resumen rápido del uso de memoria de los diferentes componentes involucrados:

                             | 64 bits | 32 bits
-------------------------------------------------- -
zval | 24 bytes | 16 bytes
+ información GC cíclica | 8 bytes | 4 bytes
+ encabezado de asignación | 16 bytes | 8 bytes
================================================== =
zval (valor) total | 48 bytes | 28 bytes
================================================== =
cubo | 72 bytes | 36 bytes
+ encabezado de asignación | 16 bytes | 8 bytes
+ puntero | 8 bytes | 4 bytes
================================================== =
cubeta (elemento de matriz) total | 96 bytes | 48 bytes
================================================== =
totales totales | 144 bytes | 76 bytes

Nuevamente, para matrices grandes y estáticas, si llamo como:

 $startMemory = memory_get_usage(); $array = new SplFixedArray(100000); for ($i = 0; $i < 100000; ++$i) { $array[$i] = $i; } echo memory_get_usage() - $startMemory, ' bytes';

Dará como resultado 5600640 bytes

Eso es 56 bytes por elemento y, por lo tanto, mucho menos que los 144 bytes por elemento que usa una matriz normal. Esto se debe a que una matriz fija no necesita la estructura de depósito. Por lo tanto, solo requiere un zval (48 bytes) y un pointer (8 bytes) para cada elemento, dando los 56 bytes observados.

Esperamos que esto sea útil.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda