unlimited reported recommended memory_limit ilimitado htaccess php memory scalability

reported - php memory_limit recommended value



Incrementando memory_limit PHP. ¿En qué punto se vuelve loco? (3)

¿Has intentado dividir el conjunto de datos en partes más pequeñas y procesar solo una parte a la vez?

Si obtiene los datos de un archivo de disco, puede usar la función fread() para cargar fragmentos más pequeños, o algún tipo de consulta db sin búfer en caso de base de datos.

No he revisado PHP desde v3.something, pero también podría usar una forma de computación en la nube. El conjunto de datos de 1GB parece ser lo suficientemente grande como para procesarse en varias máquinas.

En un sistema en el que estoy trabajando actualmente, hay un proceso que carga una gran cantidad de datos en una matriz para ordenar / agregar / lo que sea. Sé que este proceso necesita optimización para el uso de la memoria, pero a corto plazo solo necesita funcionar.

Dada la cantidad de datos cargados en la matriz, seguimos golpeando el límite de memoria. Se ha incrementado varias veces, y me pregunto si hay un punto donde aumentarlo se convierta generalmente en una mala idea. o solo es una cuestión de la cantidad de RAM que tiene la máquina?

La máquina tiene 2GB de RAM y el memory_limit actualmente está configurado en 1.5GB. Podemos agregar fácilmente más RAM a la máquina (y lo hará de todos modos).

¿Han encontrado otras personas este tipo de problema? y cuales fueron las soluciones?


Dado que usted sabe que hay problemas de memoria con su script que deben corregirse y que solo está buscando soluciones a corto plazo, entonces no abordaré las formas de crear perfiles y resolver sus problemas de memoria. Parece que vas a llegar a eso.

Por lo tanto, diría que las principales cosas que debes tener en cuenta son:

  • Carga de memoria total en el sistema
  • Capacidades de SO

PHP es solo un pequeño componente del sistema. Si permite que consuma una gran cantidad de RAM, los otros procesos sufrirán, lo que a su vez podría afectar al script en sí. En particular, si extrae una gran cantidad de datos de una base de datos, entonces su DBMS podría requerir mucha memoria para crear conjuntos de resultados para sus consultas. Como una solución rápida, es posible que desee identificar las consultas que está ejecutando y liberar los resultados lo antes posible para obtener más memoria para una ejecución de trabajo prolongada.

En términos de capacidades de sistema operativo, debe tener en cuenta que los sistemas de 32 bits, en los que probablemente se está ejecutando, solo pueden gestionar hasta 4 GB de RAM sin un manejo especial. A menudo, el límite puede ser mucho menor según cómo se use. Algunos conjuntos de chips y configuraciones de Windows pueden tener menos de 3GB disponibles para el sistema, incluso con 4 GB o más instalados físicamente. Debería verificar cuánto puede abordar su sistema.

Usted dice que ha aumentado el límite de memoria varias veces, por lo que, obviamente, este trabajo es cada vez más grande en su alcance. Si tienes hasta 1.5 Gb, incluso la instalación de 2 Gb más de RAM parece que será un breve respiro.

¿Han encontrado otras personas este tipo de problema? y cuales fueron las soluciones?

Creo que probablemente ya sepa que la única solución real es descomponerse y pasar el tiempo para optimizar el script pronto, o terminará con un trabajo que será demasiado grande para ejecutar.


La configuración del memory_limit de memory_limit de PHP que se ejecuta como un módulo de Apache para las páginas web de los servidores debe tener en cuenta cuántos procesos de Apache puede tener al mismo tiempo en la máquina: consulte la opción de configuración de MaxClients para Apache.

Si MaxClients es 100 y tiene 2,000 MB o RAM, un cálculo muy rápido mostrará que no debe usar más de 20 MB * (porque 20 MB * 100 clientes = 2 GB o RAM, es decir, la cantidad total de memoria que su servidor tiene ) * para el valor memory_limit.

Y esto es sin tener en cuenta que probablemente haya otras cosas ejecutándose en el mismo servidor, como MySQL, el sistema en sí, ... Y que Apache probablemente ya esté usando memoria para sí mismo.

O por supuesto, este es también un "peor escenario", que considera que cada página PHP está usando la cantidad máxima de memoria que puede.


En su caso, si necesita una gran cantidad de memoria para un solo trabajo, no aumentaría el memory_limit para PḦP que se ejecuta como un módulo de Apache.

En cambio, iniciaría ese trabajo desde la línea de comandos (o mediante un trabajo cron) y especificaría un memory_limit memoria más memory_limit específicamente en este único caso.

Esto se puede hacer con la opción -d de php, como:

$ php -d memory_limit=1GB temp.php string(3) "1GB"

Teniendo en cuenta, en este caso, que temp.php solo contiene:

var_dump(ini_get(''memory_limit''));

En mi opinión, esto es mucho más seguro que aumentar el memory_limit para el módulo PHP para Apache, y es lo que suelo hacer cuando tengo un gran conjunto de datos, o algunas cosas realmente pesadas que no puedo optimizar ni paginar.


Si necesita definir varios valores para la ejecución de PHP CLI, también puede indicarle que use otro archivo de configuración, en lugar del php.ini predeterminado, con la opción -c :

php -c /etc/phpcli.ini temp.php

De esa forma, tienes:

  • /etc/php.ini para Apache, con low memory_limit , low max_execution_time , ...
  • y /etc/phpcli.ini para lotes que se ejecutan desde la línea de comandos, prácticamente sin límite

Esto garantiza que sus lotes podrán ejecutarse, y aún tendrá seguridad para su sitio web ( memory_limit y max_execution_time son medidas de seguridad)


Aún así, si tiene tiempo para optimizar su script, debería hacerlo; por ejemplo, en ese tipo de situación donde tienes que lidiar con muchos datos, la paginación es imprescindible ;-)