vacia tengo telefono recibir puedo puede pero nada mensajes memoria llena insuficiente instalar falso esta espacio error enviar celular aplicaciones almacenamiento php memory

telefono - Error fatal: memoria insuficiente, pero tengo mucha memoria(PHP)



mi celular dice memoria llena y esta vacia (19)

Comenzaría por actualizar PHP a 5.4+, ya que es hasta un 50% más rápido para algunas aplicaciones. Arreglaron una gran cantidad de pérdidas de memoria. Por favor, consulte becnhamrks: http://news.php.net/php.internals/57760

Como mi pregunta es cada vez más larga, decido volver a escribir toda la pregunta para que sea mejor y más breve.

Ejecuto mi sitio web en un servidor dedicado con memoria de 8GB. Soy plenamente consciente de que necesito aumentar el límite de memoria en la configuración de php.ini. Lo configuré de 128M a 256M y a -1. Aún así, el problema es la persistencia.

Error fatal: falta de memoria (asignado 786432) (intentado asignar 24576 bytes) en D: / www / football / views / main.php en la línea 81

La falta de memoria no tiene sentido porque dice que solo se asignan 786432 bytes y se necesitan 24576 bytes más.

786432 bytes tiene solo 768 kilobytes y es bastante pequeño.

Sugerencias

  • El error ocurre en una línea muy aleatoria. No siempre es un error en la línea número 81.
  • En el momento pico, Apache solo toma alrededor de 500 mb de memoria. Todavía tengo 6GB de sobra.
  • No hay un bucle infinito
  • La secuencia de comandos toma 1,042,424 bytes. Obteniendo este número de echo memory_get_peak_usage();
  • El conjunto de resultados de MySQL es pequeño (como máximo 12 de las filas, puramente texto, sin datos de blobs)
  • ( Importante ) Si reinicio Apache una vez cada dos días, el error desaparecerá. Suele suceder cuando Apache se ejecuta más de 2 días.
  • Incluí el perfil del script y puedes obtenerlo here .
  • Este servidor dedicado se usa exclusivamente para ejecutar solo un sitio web. Este sitio web es un sitio web de alto tráfico con un promedio de 1,000 visitantes por minuto. En el momento pico, habrá entre 1,700 y 2,000 visitantes accediendo al mismo tiempo.

Especificación del servidor

Sistema operativo: Windows 2008 R2 64-Bit
CPU: Intel Core i5 - 4 núcleos
RAM: 8 GB
Apache 2.2
PHP 5.3.1
Almacenamiento: 2 discos duros de 1 TB
Ancho de banda: 10 TB por mes

Solución

Finalmente me puse a tono y solucioné el problema y me gustaría compartirlo aquí. Lo que he hecho para mejorar:

  1. faltó el favicon.ico que estropeó con mi motor de ruta. Aunque mi motor de rutas es muy pequeño, pero al incluir favicon.ico , ayuda a reducir el uso de memoria al no ejecutar mi motor de rutas. La mayor parte de mi sitio web lo tiene y olvidé ponerlo para esta nueva sección.
  2. Limitar MaxRequestPerChild ayuda. En mi otro servidor dedicado, tengo mi MaxRequestPerChild limitado. Para este servidor, lo configuré en 0. Siempre pensé que cada script estaba aislado. Digamos si mi script tarda 800kb en ejecutarse. Una vez completado, Apache o PHP deberían liberar 800kb de memoria. Parece que no funciona de esta manera. MaxRequestPerChild limitado ayuda a evitar la pérdida de memoria al crear un nuevo proceso después de MaxRequestPerChild limitado y el proceso anterior se está extinguiendo. Esta es mi nueva configuración.

    ThreadsPerChild 1500 MaxRequestsPerChild 10000

  3. ob_flush(); reduce un poco más de memoria. No ayuda mucho, pero todo lo optimizado ayuda.

  4. He usado xdebug que nunca antes había usado, como lo sugirieron personas que intentaron responder esta pregunta. Debo decir que es una gran herramienta y he optimizado algunas cosas para que funcione un poco más rápido.
  5. Deshabilité algunos módulos de Apache innecesarios. Intento desactivarlo uno por uno y dejarlo unos días para asegurarme de que funciona perfectamente antes de desactivar otro. Tengo inhabilitar la extensión PHP innecesaria ahora.
  6. La mayor parte de mi script en este servidor se usó de manera tradicional (sin plantilla, sin capa de base de datos, PHP puro, HTML y función mysql_ * heredada). Para ser honesto, funciona muy rápido y usa memoria extremadamente pequeña. Sin embargo, el mantenimiento del script no es muy fácil ya que el sitio web se está haciendo más extenso. He tratado de convertir algunas partes del sitio web en el marco adecuado (mi propio marco pequeño). La razón por la que utilicé mi propio marco es pequeño (3kb para todo el marco e incluyo solo lo que necesito).
  7. Cambiando a IIS7.5 resolviendo completamente este problema .

Del archivo de salida del generador de perfiles he notado un par de cosas que no me han gustado / en las que he confiado mucho y las examinaré:

Además de no conocer el significado de los números de salida para detectar una anomalía o cómo funcionan los scripts PHP ... ¿No es un problema? ¿Tener una inclusión en el mismo archivo main.ph, que parece una cosa recursiva?

2121 fl=D:/www/football/views/main.php 2122 fn=include::D:/www/football/views/main.php

Noté el archivo D:/www/football/views/main.php está haciendo uso de algunas funciones de cadena varias veces, supongo que está llamando a estas funciones en los datos devueltos por su consulta:

strlen substr strtotime

Si, como en el lenguaje C, estas funciones requieren que las cadenas terminen null o algún otro extremo del terminador de cadena para evitar problemas de memoria, miraría las cadenas devueltas por su consulta.

¿Puedes publicar la url de tu sitio web?


En mi caso, este error se desencadenó debido a una gran consulta de selección (cientos de miles de resultados devueltos).

Surgió inmediatamente después de agregar millones de registros en mi Base de datos para probar la escalabilidad de WordPress, por lo que fue la única razón probable para mí.


Este es un error conocido en PHP v 5.2 para Windows, está presente al menos en la versión 5.2.3: https://bugs.php.net/bug.php?id=41615

Ninguna de las soluciones sugeridas nos ha ayudado, tendremos que actualizar PHP.


Hola, también tengo el mismo problema en mi servidor. Solo cambié las siguientes cosas:

cambiar php.ini a ...

memory_limit = 128M

y agregar a httpd.conf

RLimitMEM 1073741824 2147483648

y reiniciar Apache & i eliminó el error:


Instale xdebug y habilite el disparador de perfilador. Genere un archivo de perfil, luego publique el archivo cachegrind si aún no puede decir el origen del problema.

EDITAR: archivo de perfil de la página donde ocurre la fuga de memoria, por supuesto!


Intente ejecutar php sobre fcgid, esto puede ayudar:

Estos son los errores clásicos que verá al ejecutar PHP como un módulo de Apache. Luchamos con estos errores durante meses. Cambiar a usar PHP a través de mod_fcgid (como recomienda James) solucionará todos estos problemas. Asegúrese de tener instalado el último paquete Redistribuible de Visual C ++:

http://support.microsoft.com/kb/2019667

Además, recomiendo cambiar a la versión de 64 bits de MySQL. Ya no hay una razón real para ejecutar la versión de 32 bits.

Fuente: Apache 2.4.6.0 falla debido a un problema en php5ts.dll 5.5.1.0


La mayoría de las veces se produce ese error, el problema está en el código. No estoy tratando de decir que está escribiendo un código que es malo, estoy tratando de decir que necesita observar cuidadosamente lo que hay allí que está usando esta cantidad de memoria.

Recuerde siempre que "la recolección de basura en PHP es bastante mala ", no es como Java, ningún otro lenguaje similar. hay una manera de hacer cumplir la recolección de basura a través de gc_collect_cycle , pero, en mi opinión personal, eso no resolverá su problema. PHP libera toda la memoria utilizada para ejecutar una página, una vez completado el ciclo solicitud-respuesta, por lo que puede tener problemas de memoria, si su script es de larga ejecución, como un script de fondo (Gearman, etc.), porque la memoria no se libera hasta script se está ejecutando.

Si lo anterior no es el caso con su scr, pt, y como dijo no existe un código que requiera una gran cantidad de memoria, entonces el problema es definitivamente el código en sí mismo y la actualización a cualquier versión de PHP no resolverá el problema. Estaba enfrentando uno de mis scripts Gearman una vez, y había un problema con uno de mis bucles en el que estaba agregando una variable a uno de mi matriz, la variable en sí misma era muy pesada (aproximadamente 110 KB de datos). Entonces, sugeriría, haga una inspección cuidadosa de su código.

Violar


Los siguientes dos hechos apuntan definitivamente a pérdidas de memoria:

  1. El error aparece en diferentes líneas en tu código,
  2. El error informa una asignación de memoria relativamente pequeña.

Primero seleccionaría PDO, deshabilitaría todas las demás extensiones y lo dejaría funcionar durante la noche usando algo como Siege / Apache Bench (ab). También puedes intentar ejecutarlo usando la interfaz cli (solo asegúrate de mantener los mismos límites de memoria).

Puede usar la función memory_get_peak_usage() al final de su secuencia de comandos para ver cuánta memoria cree que ha estado utilizando PHP.

De tu comentario que es de 800 kB, que está bien; Definitivamente no es la cantidad gigantesca de memoria que causaría una falta de memoria ;-)

Por último, aunque no recomendaría actualizar a 5.4 en este momento, la actualización a la última versión 5.3.x probablemente valga la pena debido a las múltiples vulnerabilidades y fugas que se han abordado desde 5.3.1


Me encontré con el mismo tipo de problema con el servidor que muere al intentar usar el intercambio. Esto es porque mod_php no libera memoria alguna vez . De modo que los procesos de Apache siguen creciendo ya sea alcanzando el límite de memoria de Apache o PHP o, si no hay límite, bloqueando el servidor.

Reiniciar Apache hace que se generen nuevos procesos nuevos, pero a medida que ejecutan scripts PHP a lo largo del tiempo, crecen hasta que surgen problemas.

La solución es hacer que Apache elimine los procesos después de que se haya atendido una cierta cantidad de consultas, de modo que creará nuevas (Hay algunas preguntas relacionadas con eso ) reduciendo la opción de configuración MaxRequestsPerChild a, digamos 100 (Predeterminado a 1000).

Por supuesto, esto puede reducir el rendimiento del servidor, ya que requiere recursos para matar y generar nuevos procesos, pero al menos mantiene el sitio funcionando. Es posible que tengas la tentación de aumentar el número de procesos en ejecución para mantener el rendimiento alto, asegúrate de que el límite de memoria de PHP (o apache) x la cantidad máxima de procesos no supere el límite físico de tu servidor.

Aquí está mi experiencia, espero que ayude.


Para empezar, memory_get_peak_usage() no será útil aquí. Solo devolverá la cantidad de memoria asignada, y ese es el mismo número que causó el error.

memory_get_usage devolverá la cantidad activa de memoria que se está asignando cuando se memory_get_usage .

ini_set(''memory_limit'', ''256M''); establecerá la asignación máxima de la huella de PHP en la memoria de su sistema. Si obtienes OOM en 768K, subirlo no solucionará el problema.

No hay ninguna indicación sobre la versión de PHP que está utilizando, pero sugeriría una actualización inmediatamente. Hay varios errores en los que el Gerente de memoria de Zend no puede desasignar la memoria, lo que lo llevaría exactamente al mismo problema.

¿Están funcionando su servidor local y su servidor de producción con la misma versión del sistema operativo, el mismo bit largo y la misma versión de PHP? La respuesta será no.

Si no está relacionado con el problema de windows malloc() , ya que es un subdominio y probablemente dentro de VirtualHost, y asigna solo 768k, casi parece un problema de sistema operativo.

Ejecute la tasklist de tasklist desde el símbolo del sistema cuando acceda a su secuencia de comandos. ¿Ve un subproceso de Apache adicional o el uso de memoria en el pico de los procesos?

Una última idea es ejecutar run flush() y / o ob_flush(); después de cada ciclo para la fila / columna de la tabla. Esto debería borrar su memoria intermedia y guardarle algo de memoria en caso de que ocurra el problema.


Podría ser un problema con MySQL y la cantidad de conexiones abiertas, por lo que se soluciona cuando se reinicia cada pocos días. ¿Se cierran automáticamente al apagar el script?


Solo para recapitular (estoy agregando esta respuesta bastante lejos de la pregunta original):

  • PHP no puede asignar lo que parece ser una pequeña cantidad de memoria
  • el uso actual de la memoria en el momento en que aparece el error + la cantidad solicitada es menor que el límite de memoria actualmente en vigor
  • el sistema tiene 6Gb disponible para uso de PHP cuando esto ocurre
  • ya que el problema se resuelve reiniciando Apache - es apache lo que impide que la memoria de beig esté disponible para PHP

Si todos son válidos, la única explicación posible es que el 6Gb está muy fragmentado, lo que creo que es un poco improbable. ¿No dijiste cómo se invoca PHP desde Apache - mod_php? fpm? Fcgi?

Comenzaría por examinar cada uno de los predicados anteriores, particularmente el de memoria libre. ¿Cómo sabes que hay 6Gb libres cuando ocurre el error ? Una causa más probable es que hay una pérdida de memoria que no está detectando.

No ha proporcionado ningún detalle sobre cómo Apache está configurado; También echaré un vistazo a la reducción de MaxRequestsPerChild y MaxMemFree. (No estoy muy familiarizado con el apache del trabajador, donde esto se aplicará por cada hilo; realmente necesita un límite por proceso). Si proporcionó la configuración básica de la configuración de Apache, entonces tal vez podríamos hacer más sugerencias.

A menos que esté usando Ajax extensamente, asegúrese de que su tiempo de keepalive sea 2 o menos.


Supongo que no ha editado el php.ini correcto o no ha reiniciado PHP y / o el servidor web.

Cree una página phpinfo.php en su docroot con los contenidos <?php phpinfo(); para asegurarse de que está cambiando el php.ini correcto. Además de la ubicación del archivo php.ini que está utilizando el servidor web, también indicará la memoria máxima de scripts permitida.

A continuación, agregaría algunos rastros de pila a su página para que pueda ver la cadena de eventos que llevaron a esto. La siguiente función detectará errores fatales y proporcionará más información sobre lo sucedido.

register_shutdown_function(function() { if($error = error_get_last()) { // Should actually log this instead of printing out... var_dump($error); var_dump(debug_backtrace()); } });

Personalmente, Nginx + PHP-FPM es lo que he usado durante años desde que dejé slow ol ''Apache.


Tenga en cuenta que el error es Out of memory y no está Allowed memory size [..] exhausted .

Entonces la fuga de memoria está en otra parte del sistema. Es posible que el servidor mysql use mucha memoria del sistema después de esta pesada consulta, dejando apache / php sin él físico y swap.

Esto debería explicar el error siempre en la misma línea (y / o en el mismo script).


Tuve un problema similar con PHP:

1) Verifique sus registros de errores. Elimine CADA error antes de continuar. 2) Considere modificar su configuración de apache para eliminar los módulos no utilizados, esto reducirá la huella que necesita PHP. Aquí hay un gran enlace para esto: es específico de Wordpress pero aún así debería ser muy útil http://thethemefoundry.com/blog/optimize-apache-wordpress/

Para darte una idea del tipo de error que encontré, tenía un código que intentaba publicar contenido en Facebook, luego Facebook modificó su API por lo que se rompió, también usé un ''expirator de contenido'', lo que básicamente significaba que no volvía a intentarlo. publicar este contenido en Facebook y dejar muchos objetos en la memoria.


Yo diría que el servidor se está quedando sin memoria física / de intercambio, por lo que PHP no puede asignar suficiente memoria.

¿Puedes pegar la salida de forma free aquí?


esto me pasó hace unos días. Hice una nueva instalación y todavía sucedió. por lo que todos ven y en función de las especificaciones de tu servidor. lo más probable es que sea un bucle infinito. podría no estar en el código PHP en sí, sino en las solicitudes hechas a Apache.

digamos cuando accede a esta url http: // localhost / mysite / page_with_multiple_requests

Verifique el registro de acceso de Apache si recibe múltiples solicitudes. rastrear esa solicitud y verificar el código que podría causar un ''cuello de botella'' en el sistema (el ejecutor de la mina () cuando usa sendmail). El cuello de botella que estoy hablando no necesita ser un ''bucle infinito''. Podría ser una función que tarde algún tiempo en terminar. o tal vez algunas de las '' funciones de ejecución del programa '' de php

Es posible que también deba verificar las solicitudes ajax (las que se ejecutan cuando se carga la página). si esa solicitud ajax redirige a la misma URL

por ejemplo, httpx: // localhost / mysite / page_with_multiple_requests

sería ''rehacer'' las solicitudes de nuevo

sería útil si publicas las líneas aleatorias o el código en sí mismo donde termina el guión, tal vez haya un código de "bucle" en algún lugar. imho php no solo llamará líneas aleatorias para nada.

http://blog.piratelufi.com/2012/08/browser-sending-multiple-requests-at-once/


Error fatal: falta de memoria (asignado SOLUCIONADO
tuve un problema similar, durante meses no hubo solución. finalmente, estaba revisando una de las carpetas de apache, es decir, (/ apache / conf / extra) encontré este archivo que controla la asignación de memoria de apache. el nombre del archivo es httpd-mpm en ese archivo para aumentar el MaxMemFree que está configurado en 2048 a algo más alto, tomé el mío a 10000 para el primer MaxMemFree (IfModule! mpm_netware_module) y luego hice el segundo MaxMemFree para 5000 IfModule mpm_netware_module.

Estos resolvieron mi problema. Espero eso ayude