Error Fatal: se Permite el Tamaño de la Memoria de 134217728 Bytes Agotado (CodeIgniter + XML-RPC)

Tengo un montón de cliente de punto de venta (POS) de los sistemas que enviar periódicamente nuevos datos de ventas a una base de datos centralizada, que almacena los datos en una gran base de datos para la generación de informes.

La cliente POS se basa en PHPPOS, y he implementado un módulo que utiliza el estándar XML-RPC de la biblioteca para enviar los datos de ventas para el servicio. El sistema de servidor está construido sobre CodeIgniter, y se utiliza XML-RPC y XML-RPC bibliotecas para el webservice componente. Siempre me envía una gran cantidad de datos de ventas (tan poco como 50 filas de la tabla de ventas, y cada una de las filas de sales_items correspondientes a cada elemento dentro de la venta) me sale el siguiente error:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M es el valor predeterminado en php.ini, pero supongo que es un número enorme de romper. De hecho, incluso he tratado de establecer este valor a 1024M, y todo lo que hace es tomar un tiempo más largo para el error.

Como para los pasos que he tomado, he intentado desactivar todo el procesamiento en el lado del servidor, y han manipulado para devolver una respuesta enlatada, independientemente de la entrada. Sin embargo, creo que el problema radica en la transmisión de los datos. Incluso he intentado desactivar el máximo de la secuencia de comandos de tiempo de ejecución de PHP, y todavía errores.

Estoy un poco confundida… ¿de dónde viene el error se producen en el cliente o en el servidor? Y en qué etapa… cliente enviar, el servidor de recepción, procesamiento del servidor, el servidor de envío, el cliente de la recepción o procesamiento de cliente?
Cómo/dónde está estableciendo la memory_limit a 1024M?
El error parece ocurrir ya sea durante el cliente que envía, o el servidor que recibe. He intentado desactivar todos los serverside de procesamiento, y el aparejo que para enviar una respuesta enlatada, independientemente de los datos enviados. El error se produce si puedo enviar más de una cierta cantidad de datos. Voy a cambiar el PHP.configuración ini.
límite de memoria es de 128 mb, souble: ini_set('memory_limit', '256M');
Resumen votada abajo todos los «ignorar la fuga» de respuestas, la gente que está confundido CodeIgniter con Drupal y la gente que acaba de copiar y pegar de otros pueblos respuestas para conseguir puntos. La calidad de las respuestas en este es abismal.

OriginalEl autor ArcticZero | 2009-02-18

23 Kommentare

  1. 610

    Cambiar el memory_limit por ini_set('memory_limit', '-1'); es no una solución adecuada. Por favor, no hagas eso.

    El código de PHP que puede haber una pérdida de memoria en algún lugar y le está diciendo al servidor sólo para uso de toda la memoria que quiere. No han solucionado el problema en absoluto. Si usted vigilar su servidor, verás que ahora es, probablemente, el uso de la mayor parte de la RAM e incluso el intercambio de disco.

    Probablemente, usted debe tratar de localizar el código erróneo en su código y solucionarlo.

    usted está probablemente en lo cierto el 95% del tiempo. Sin embargo, hay veces cuando usted realmente no necesita más memoria. Por ejemplo, digamos que su aplicación es la carga de una enorme cantidad de datos en la memoria para su procesamiento (por ejemplo una lista de Materiales con 15k de los componentes). No es siempre el caso de que el código está libre de errores, a veces sólo se necesita un poco más de memoria (por ejemplo, 256 MB en lugar de 128MB). Sin embargo estoy de acuerdo que se ajuste a -1 es horriblemente malo. Pero el ajuste del límite de memoria para un uso razonable de situaciones en tiempo de ejecución es perfectamente aceptable en mi humilde opinión.
    sí tienes razón en que a veces un proceso que requiere más memoria, pero usted debe aumentar el límite de memoria para algunas lógicas de cantidad como de 256 mb como usted dijo o 512 mb, por qué no, PERO no -1 😉
    Estoy totalmente de acuerdo, un valor de -1 podría ser útil sólo en dev entornos para los propósitos de la prueba.
    en los casos a que se denomina el restante 5% de la lectura de los datos en trozos y el uso de un trabajador a proceso en lugar de utilizar más memoria. Esta solución se escala bien mientras tu sugerencia no funcionan, excepto tu mantenga el relleno más y más memoria en su servidor durante el tiempo si los datos crece.
    Pero, ¿cómo hacer un seguimiento de este tipo de error?

    OriginalEl autor Jeff

  2. 194

    ini_set('memory_limit', '-1'); reemplaza el valor predeterminado Límite de memoria de PHP.

    ¿Por qué -1 en el ini_set trabajo?
    -1 es un valor PHP entiende como ilimitado en este contexto.
    también consumen recursos del servidor no de repuesto.
    Lástima que este hace tanta upvotes. Ajuste a un valor exacto, ya sea con php.ini ediciones o ini_set, es una solución perfectamente válida cuando la gente necesita más memoria. Ajuste ilimitado es un peligroso hack 🙁
    entonces lo puso a un buen valor. Usted puede prevenir la secuencia de comandos de tirar el error estableciendo a 1024M. Si esta respuesta, dijo ini_set(‘memory_limit’, ‘1024M’); Usted podría copiar-pegar y aceptar. Se establece en -1 se están preparando para tener un script que consume toda la memoria. Especialmente si se hace de manera rutinaria. Poner «peligroso» entre comillas no lo hace menos peligroso. Usted realmente podría manguera de su servidor de hosting. Tal vez empezar a destruir los datos. No sé, tal vez de perder su trabajo? Suena bastante peligroso para mí. 😐

    OriginalEl autor Chris Lane

  3. 111

    La forma correcta es a editar su php.ini archivo.
    Editar memory_limit a su deseo de valor.

    A partir de su pregunta, 128M (que es el límite predeterminado) ha sido superado, por lo que hay algo seriamente mal con su código ya que no debe tomar mucho.

    Si usted sabe por qué se tarda mucho y desea permitir que se establezca memory_limit = 512M o más y usted debe ser bueno.

    Honestamente, si el almacenamiento en caché de algunas serias cantidades de datos, esta es la respuesta correcta. 128M no es suficiente para que ciertas secuencias de comandos. Los 512M o 1024M menudo será suficiente, pero usted tiene que decidir caso por caso.
    Yeha, sin embargo, tratar de evitar los enormes uso de memoria, si el número de usuarios va a ser más
    memory_limit = -1 ; establecer en php.ini
    Que quita el memory_limit, que sólo desea si va a supervisar el uso de memoria de alguna otra manera. El OS matará el proceso si se trata de tomar una gran cantidad de memoria en algún punto de alguna manera.

    OriginalEl autor Basav

  4. 82

    La asignación de memoria para PHP puede ser ajustado de forma permanente o temporal.

    Permanentemente

    Puede cambiar de forma permanente la memoria de PHP asignación de dos maneras.

    Si usted tiene acceso a su php.ini archivo, puede editar el valor de memory_limit a su deseo de valor.

    Si usted no tiene acceso a su php.ini archivo (y tu servidor lo permite), se puede anular la asignación de memoria a través de su .htaccess archivo. Agregar php_value memory_limit 128M (o cualquiera que sea su deseada de la asignación).

    Temporal

    Puede ajustar la asignación de la memoria sobre la marcha de dentro de un archivo PHP. Usted simplemente tiene el código ini_set('memory_limit', '128M'); (o cualquiera que sea su deseada de la asignación). Usted puede quitar el límite de memoria (aunque la máquina o a instancia de los límites todavía se pueden aplicar) al establecer el valor de «-1».

    Gracias yo no creo que para comprobar si alguien había establecido el valor en .htaccess que era primordial de php.ini y yo no podía averiguar por qué +1

    OriginalEl autor Umair Idrees

  5. 54

    Es muy fácil llegar a las fugas de memoria en un script de PHP – especialmente si el uso de la abstracción, como un ORM. Trate de usar Xdebug para el perfil de la secuencia de comandos y averiguar donde todos los que la memoria se fue.

    Voy a ir a tratar de Xdebug. Nunca lo he usado antes, así que voy a tener que leer sobre él. Gracias por responder! Espero encontrar la respuesta a esta pronto…
    Recuerda que PHP se usa el conteo de referencias para la gestión de la memoria. Así que si usted tiene referencias circulares, o de las variables globales, los objetos no son reciclados. Que suele ser la raíz de las pérdidas de memoria de PHP.
    Xdebug muestra que CI Xmlrpc.php la biblioteca es responsable de mi pérdida de memoria. Por casualidad, ¿habría algún problema con CodeIgniter XML-RPC bibliotecas que debo conocer? He intentado desactivar todo el procesamiento del lado del servidor, y todavía se queda sin memoria si doy de comer lo suficiente de datos.
    No sé/uso de CI, así que no sé. Pero probablemente, usted debe tratar de encontrar un objeto que no se libera hasta después de su uso – lo más probable debido a una referencia cíclica. Es detective-trabajo.
    Esta es la única respuesta aquí que asesora a la realidad de abordar el problema. Las otras respuestas de la manivela de la memoria para que venda más de un síntoma e ignorar el enfermedades.

    OriginalEl autor troelskn

  6. 44

    Cuando la adición de 22,5 millones de registros en una matriz con array_push yo seguía recibiendo «memoria agotada» errores fatales en cerca de 20 millones de registros con 4G como el límite de memoria de php.ini. Para solucionar esto he añadido la declaración

    $old = ini_set('memory_limit', '8192M'); 

    en la parte superior del archivo. Ahora todo está funcionando bien. No sé si php tiene una pérdida de memoria, que no es mi trabajo, ni me importa. Sólo tengo que hacer mi trabajo, y esto funcionó.

    El programa es muy simple:

    $fh = fopen($myfile);
    while (!feof($fh)) {
          array_push($file, stripslashes(fgets($fh)));
    }  
    fclose($fh);

    El fatal error de los puntos de la línea 3, hasta que me impulsó el límite de memoria, que
    eliminado el error.

    te refieres a ini_set('memory_limit', '8192M'); ?
    la mejor solución ! a mí me funcionó!
    Qué lujo sería tener tiempo para ir y optimizar una secuencia de comandos para algo como eso. O la investigación, comparar y aprender herramientas ETL o alguna de esas. En el mundo real, tenemos el jack de la memoria de la franquicia, al hacer la cosa, y seguir adelante.

    OriginalEl autor JamesAD-0

  7. 38

    Yo seguía recibiendo este error, incluso con memory_limit establecido en php.ini, y el valor de la lectura correctamente con phpinfo().

    Cambiando de esto:

    memory_limit=4G

    A este:

    memory_limit=4096M

    Esta rectificado el problema en PHP 7.

    OriginalEl autor Danny Beckett

  8. 20

    Cuando vea el error anterior – especialmente si el (tried to allocate __ bytes) es un valor bajo, que podría ser un indicador de un bucle infinito, como una función que se llama a sí mismo, sin salida:

    function exhaustYourBytes()
    {
        return exhaustYourBytes();
    }

    OriginalEl autor Kristen Waite

  9. 17

    Después de habilitar estas dos líneas.

    Se comenzó a trabajar

    ; Determines the size of the realpath cache to be used by PHP. This value should
    ; be increased on systems where PHP opens many files to reflect the quantity of
    ; the file operations performed.
    ; http://php.net/realpath-cache-size
    realpath_cache_size = 16k
    
    ; Duration of time, in seconds for which to cache realpath information for a given
    ; file or directory. For systems with rarely changing files, consider increasing this
    ; value.
    ; http://php.net/realpath-cache-ttl
    realpath_cache_ttl = 120

    Error Fatal: se Permite el Tamaño de la Memoria de 134217728 Bytes Agotado (CodeIgniter + XML-RPC)

    OriginalEl autor Prem Kumar Maurya

  10. 15

    Usted puede fijar adecuadamente esta cambiando memory_limit en fastcgi/fpm

    $vim /etc/php5/fpm/php.ini

    Cambiar la memoria de 128 a 512 ver abajo

    ; Maximum amount of memory a script may consume (128MB)
    ; http://php.net/memory-limit
    memory_limit = 128M

    a

    ; Maximum amount of memory a script may consume (128MB)
    ; http://php.net/memory-limit
    memory_limit = 512M

    OriginalEl autor Derick Fynn

  11. 13

    De su sitio directorio raíz:-

    ini_set('memory_limit', '1024M');
    esto funcionó para mí. el amor de una línea de soluciones. +1 por simplicidad

    OriginalEl autor Gaurang P

  12. 10

    En Drupal 7, usted puede modificar el límite de memoria en la settings.php archivo que se encuentra en los sitios/carpeta predeterminada. Alrededor de la línea 260, verás esto:

    ini_set('memory_limit', '128M');

    Incluso si su php.ini de configuración son lo suficientemente altos, usted no será capaz de consumir más de 128 mb, si este no se ha establecido, en su web en Drupal settings.php archivo.

    No en Drupal7 no hay tal cadena de código en settings.php
    También existe ninguna cadena en settings.php para drupal 6

    OriginalEl autor LK7889

  13. 9

    Para Drupal usuarios, esta Chris Lane respuesta de:

    ini_set('memory_limit', '-1');

    funciona, pero hay que ponerlo justo después de la apertura

    <?php

    etiqueta en la index.php archivo en su sitio del directorio raíz.

    OriginalEl autor sigmapi13

  14. 7

    Lugar de cambiar la memory_limit valor en su php.ini archivo, si hay una parte del código que puede utilizar una gran cantidad de memoria, se puede quitar el memory_limit antes de que la sección se ejecuta y, a continuación, reemplazar después.

    $limit = ini_get('memory_limit');
    ini_set('memory_limit', -1);
    //... do heavy stuff
    ini_set('memory_limit', $limit);

    OriginalEl autor mykeels

  15. 6

    PHP 5.3+ le permite cambiar el límite de memoria mediante la colocación de un .user.ini archivo en el public_html carpeta.
    Basta con crear el archivo de arriba y escriba la línea siguiente en él:

    memory_limit = 64M

    Algunos cPanel hosts sólo aceptan este método.

    OriginalEl autor Sabi

  16. 6

    Para aquellos que están rascándose sus cabellos, para averiguar por qué en la tierra, esta función poco debe causar una fuga de memoria, a veces por un pequeño error, una función se inicia de forma recursiva se llame a sí mismo para siempre.

    Por ejemplo, una Clase de Proxy que tiene el mismo nombre para una función del objeto que se va a proxy.

    class Proxy {
    
        private $actualObject;
    
        public function doSomething() {
    
            return $this->actualObjec->doSomething();
        }
    }   

    A veces se te olvide traer que poco actualObjec miembro y porque el Proxy en realidad tiene que haceralgo método, PHP sería no dar ningún error y de una gran clase, podría ser escondido de los ojos durante un par de minutos para averiguar qué hay una fuga de memoria.

    Y otro consejo: usted puede poner die('here') en el código y mover esa declaración a su alrededor para ver donde la recursividad se inicia.

    OriginalEl autor madz

  17. 6

    ACCIDENTE de la página?
    Error Fatal: se Permite el Tamaño de la Memoria de 134217728 Bytes Agotado (CodeIgniter + XML-RPC)

    (Esto ocurre cuando MySQL tiene para la consulta de grandes filas, por defecto, el momory_limit se establece a la pequeña, que era más seguro para el hardware)

    Puede comprobar su sistema existente estado de la memoria, antes de aumentar php.ini

    # free -m
                 total       used       free     shared    buffers     cached
    Mem:         64457      63791        666          0       1118      18273
    -/+ buffers/cache:      44398      20058
    Swap:         1021          0       1021

    Aquí he aumentado como siguiente y, a continuación, service httpd restart para solucionar el BLOQUEO de la Página de edición.

    # grep memory_limit /etc/php.ini
    memory_limit = 512M

    OriginalEl autor YumYumYum

  18. 3

    Si usted está ejecutando un WHM-powered VPS (Servidor Privado Virtual) usted puede encontrar que usted no tiene permisos para editar PHP.INI directamente; el sistema debe hacer. En el WHM del host panel de control, vaya a la Configuración del Servicio > Configuración de PHP Editor, modificar memory_limit:

    Error Fatal: se Permite el Tamaño de la Memoria de 134217728 Bytes Agotado (CodeIgniter + XML-RPC)

    OriginalEl autor Janckos

  19. 3

    Me resulta útil cuando se incluyen o que requieran:

    dbconnection.php, _functions.php
    en los archivos que se procesan,

    en lugar de incluir en la cabecera.
    Que se incluye a sí mismo.

    Así que si tu encabezado y pie de página está incluido, sólo tiene que incluir todos sus funcionales de los archivos antes de encabezado se incluye.

    OriginalEl autor Kerim

  20. 3

    Ejecutar el script como este (cron caso, por ejemplo): php5 /pathToScript/info.php produce el mismo error.

    La manera correcta: php5 -cli /pathToScript/info.php

    OriginalEl autor ratm

  21. 3

    Tuve el siguiente error mientras se ejecuta en un conjunto de datos más pequeño que había trabajado anteriormente.

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes) in C:\\workspace\image_management.php on line 173

    Como la búsqueda de la culpa que me trajo aquí pensé que me gustaría mencionar que no siempre las soluciones técnicas de la anterior pero algo más simple. En mi caso fue de Firefox. Antes de que me encontré el programa que ya estaba usando 1,157 M.

    Resulta que yo había estado viendo un 50 minutos de vídeo de un bit a la vez durante un período de días y que complicado las cosas.
    Es el tipo de revisión que los expertos correcta sin siquiera pensar en ello, pero para el que le gusta de mí es que vale la pena teniendo en cuenta.

    OriginalEl autor M61Vulcan

  22. 3

    Cambiar el límite de memoria de php.ini archivo y reiniciar apache. Después de
    reinicie ejecutar el phpinfo(); función de cualquier archivo php para memory_limit
    confirmación de cambio.

    memory_limit = -1

    límite de memoria de -1 significa que no hay límite de memoria de conjunto ahora es máximo.

    OriginalEl autor Hasib Kamal

  23. -5

    no estoy seguro si esta respuesta va a ser de ninguna ayuda, pero cuando me he quitado las siguientes líneas de mi código en todo funcionó OK!

    set_include_path(get_include_path() . get_include_path().'/phpseclib');

    include_once(‘Net/SSH2.php’);
    include_once(‘Net/SFTP.php’);

    Estas líneas fueron incluidos en cada archivo que estoy ejecutando, cuando se ejecuta los archivos uno por uno, todo funcionaba bien, pero cuando se ejecuta todos los archivos juntos, yo tengo el problema de pérdida de memoria.
    De alguna manera el «include_once» no es como las cosas de una vez, o estoy haciendo algo mal..

    set_include_path(get_include_path() . get_include_path().'/phpseclib'); Esto agregar la ruta de acceso ‘/phpseclib’ una vez por cada archivo que tiene la línea… así que puede agregar muchas veces! Te sugiero ponerlo en un archivo de configuración y include_once el archivo de configuración.

    OriginalEl autor Omar Al-Azzawi

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea