2012-10-12 80 views
20

En PHP, a menudo me enfrento a un problema de límite de memoria. Especialmente con recursos altamente sistemas integrados como Drupal, etc.Cuanto más, mejor para PHP memory_limit?

Lo que quiero saber aquí es:

  • Es bueno tener límite de memoria muy alta php como 2 GB?
  • ¿Hay algún inconveniente importante?

Editado:

Como escenario, por ejemplo, en Drupal, necesita tanta memoria mientras borrar la caché a través del Panel Web (No por Drush o cualquier secuencia de comandos). Así que incluso para solo en este caso, definitivamente necesito un límite alto de alrededor de 512MB actualmente.

+4

En una palabra, NO. Su límite de memoria debe establecerse lo más bajo posible dentro de los límites de lo que necesita. El límite de memoria se aplica a cada script de ejecución simultánea individual, no globalmente. Establecerlo bajo le ayudará a asegurarse de que si comete algún error que cause, p. un bucle infinito, el script se eliminará temprano en lugar de perder el control y detener todo el servidor. – DaveRandom

+1

¿Cuánta memoria necesitarás para atender 100 solicitudes simultáneas? 200 GB? – JvdBerg

+5

@JvdBerg El límite de memoria no define cuánta memoria se usa _actualmente_. Es solo el límite que un solo proceso puede usar. – KingCrunch

Respuesta

27

La regla de oro: solo le da a PHP lo que PHP necesita para funcionar, y nada más.

Esto evitará situaciones en las que su sistema obstruye innecesariamente en el proceso de PHP, y también le ayudará a encontrar errores (Un script que toma 1 GB de memoria es inusual, y dando un límite de 2 GB de memoria, se oculta que) .


Para casos excepcionales, donde se sabe que un único archivo de script es muy pesada de memoria, puede utilizar ini_set() para cambiar la directiva límite de memoria en tiempo de ejecución. Ver this y this.

+0

'EDITADO MI PREGUNTA POR FAVOR. ¡Así que oh dios! ahora mi sistema se está desacelerando debido a ese límite ??? (solo para borrar el proceso de caché aparentemente) @ _ @ –

+1

@ 4lvin: editado mi respuesta. –

+0

Gracias. Has resuelto incluso DOS problemas;) –

0

Si tiene scripts que sabe requieren grandes cantidades de memoria, es perfectamente seguro, y necesario, para establecer el límite alto. Pueden surgir problemas si el límite se establece en alto para el sistema con respecto a la cantidad de memoria disponible y otras aplicaciones en ejecución.

También tenga en cuenta que una secuencia de comandos defectuosa que podría terminar en un bucle infinito procesando algunos datos a menudo se detendría bastante rápido si el límite de memoria es de 64 MB o algo así. Tener el límite de memoria en 4 GB en este escenario lo dejaría con un sistema funcionando a máxima inclinación en un ciclo infinito por mucho más tiempo y podría hacer que todo su sistema dejara de responder.

Pero he tenido grandes aplicaciones de procesamiento de datos con límites de memoria de alrededor de 2-4 GB sin problemas en sistemas con 4-8 GB de memoria. Tenga en cuenta que, según lo manifestado por otros usuarios, estas aplicaciones fueron UNA instancia. Si tiene aplicaciones que ejecutan varias instancias de sus scripts (como la mayoría de las aplicaciones web), se encontrará con grandes problemas al usar mucha memoria en cada instancia. Se quedará sin memoria y otros clientes no podrán usar su aplicación hasta que la memoria se haya liberado.

Pero no solo aumente el límite de memoria para ocultar problemas. Inspeccione por qué su aplicación requiere tanta memoria y vea si puede rectificar eso primero.

5

No, cuanto más no es mejor. Es la cantidad de memoria que se puede consumir una secuencia de solo. Si su servidor contiene, por ejemplo, 4 GB de memoria, solo dos scripts podrían comerse simultáneamente toda esa memoria.

En general, los scripts PHP deben usar poca memoria. Normalmente, toda la memoria que reserva un script se libera cuando finaliza, pero puede limpiar la memoria antes de eso mediante las variables explícitamente unset que ya no se necesitan durante la ejecución. De esta forma, puede hacer que su script sea más eficiente con la memoria.

+0

'unset()' generalmente no se requiere siempre que no uses variables globales todo el tiempo. – KingCrunch

+0

@KingCrunch Incluso eso no debería marcar la diferencia, ¿verdad? 'global' sigue siendo solo global dentro de los límites de la ejecución del script, no persisten entre las solicitudes. Tenga en cuenta también que 'unset()' no garantiza que la memoria se liberará de inmediato, tendría que llamar a 'gc_collect_cycles()' también – DaveRandom

+0

'EDITADA MI PREGUNTA POR FAVOR. ¡¡¡Así que, ¡oh dios! ahora mi sistema se está desacelerando debido a ese límite ??? (solo para borrar el proceso de caché) @ _ @ –

Cuestiones relacionadas