memory - recommended - php time limit
Error de memoria insuficiente de PHP aunque no se haya alcanzado el límite de memoria. (5)
Acabo de heredar un sitio con una secuencia de comandos PHP que siempre se está quedando sin memoria a 117 MB. Esto sucede incluso cuando aumente la variable memory_limit de PHP a 312 MB, lo que estoy haciendo a través de php.ini.
Esto ahora se resuelve gracias a una gran pista de pcguru. Mira mi respuesta que comienza abajo: finalmente encontré la respuesta
ini_get(''memory_limit'')
devuelve el valor establecido en php.ini, así que estoy seguro de que Apache se ha reiniciado después de cambiar el valor. Estoy usando memory_get_usage(true)
para devolver la memoria consumida por el script en varios puntos a lo largo del camino. Y está constantemente fallando cuando llega a 117 MB.
¿Hay algún límite interno de PHP que desconozco que nunca haya asignado más de 117 MB a un script individual?
El servidor tiene 1GB de RAM y está ejecutando CentOS. Tengo acceso root shell. PHP es la versión 5.3.18. MySQL es la versión 5.1.66-cll.
Este script está detrás de un nombre de usuario / contraseña y no puedo proporcionarle acceso público.
Editado para agregar:
1) Gracias a todos por su ayuda hasta la fecha. Encontrará más información en mis respuestas a comentarios de usuarios específicos en varias respuestas a continuación.
2) Suhosin definitivamente no está instalado. He comprobado en varios lugares, incluyendo la ejecución de un script y la comprobación de constantes y la ejecución de php -v
3) El registro de apache no tiene registro del mensaje de error específico que estoy recibiendo. El registro está activado en php.ini. Entré a través de grep para buscar en todo el registro.
4) ¿Es posible que se haya informado un error incorrecto en este caso?
Dado que el servidor tiene solo 1 GB de RAM, me inclino por la posibilidad de que se haya quedado completamente sin memoria del sistema.
Ver este hilo . Obtendrá el mismo "Error fatal de PHP: sin memoria" en lugar del "Error fatal más común: Tamaño de memoria permitido de ...". Su error indica que el sistema no puede asignar más memoria, lo que significa que incluso las funciones internas de PHP: s no pueden asignar más memoria, y mucho menos su propio código.
¿Cómo se configura PHP para ejecutarse con Apache? ¿Como módulo o como CGI? ¿Cuántos procesos PHP puede tener ejecutando al mismo tiempo? ¿Tienes espacio de intercambio disponible?
Si usa PHP como un módulo en Apache, Apache tiene la mala costumbre de mantener la memoria que el proceso de PHP asignó. Adivinando, ya que no puede reiniciar el módulo PHP en el trabajador, simplemente reinicie el trabajador por completo. Cada trabajador que ha servido a PHP simplemente aumenta hasta el límite de la memoria de PHP con el tiempo, ya que ese trabajador sirve un script que asigna una gran cantidad de RAM. Por lo tanto, si tiene muchos trabajadores al mismo tiempo, cada uno con 100 MB +, se quedará sin memoria RAM rápidamente. Intenta limitar el número de trabajadores simultáneos en Apache.
Esta no es una respuesta a la razón por la cual su secuencia de comandos se está muriendo después de un cierto uso de memoria, pero puede sortearlo eliminando el límite de memoria completamente dentro de la propia secuencia de comandos de PHP:
ini_set(''memory_limit'', ''-1'');
Esto es peligroso. Si tiene un script fuera de control, PHP tomará memoria hasta que a su servidor no le quede nada para asignar y se caiga. Por lo tanto, solo debe usar esto si está seguro de que el script en sí no es un problema, y solo para probar la salida.
En cuanto a si PHP tiene algún límite por script en el uso de memoria, no. Personalmente he ejecutado scripts con casi 1 GB de uso de memoria.
Finalmente he encontrado la respuesta. La clave provino de la respuesta de pcguru, que comienza por "Ya que el servidor tiene solo 1 GB de RAM ...".
En una corazonada miré para ver si Apache tenía límites de memoria propios ya que era probable que afectaran la capacidad de PHP para asignar memoria. Justo en la parte superior de httpd.conf encontré esta declaración: RLimitMEM 204535125
Esto es puesto allí por whm / cpanel. De acuerdo con la siguiente página web, whm / cpanel calcula incorrectamente su valor en un servidor virtual ... http://forums.jaguarpc.com/vps-dedicated/17341-apache-memory-limit-rlimitmem.html
La secuencia de comandos que se queda sin memoria llega casi por completo, por lo que aumenté RLimitMEM a 268435456 (256 MB) y volví a ejecutar la secuencia de comandos. Completó su combinación de matrices y produjo el archivo csv para descargar.
ETA: Después de leer más sobre RLimitMEM y RLimitCPU, decidí eliminarlos de httpd.conf. Esto permite que ini_set (''memory_limit'', ''### M'') funcione, y ahora le doy a ese script particular la memoria extra que necesita. También doblé la memoria RAM en ese servidor.
Gracias a todos por su ayuda en la detección de este problema más bien espinoso, y especialmente a pcguru, a quien se le ocurrió la clave vital que me llevó a la solución.
Puede que esta no sea la respuesta a su problema, pero si ejecuta PHP desde la línea de comandos, puede sobrescribir el límite de memoria de php.ini.
php -d memory_limit=321M my_script.php
No estoy exactamente seguro de cuál es el límite de memoria predeterminado a través de cli.
Además, puede ejecutar php --ini
y verificar los resultados.
Tienes un bucle infinito en algún lugar de tu código.