file_put_contents() pérdida de memoria en PHP

He implementado un simple mecanismo de caché en PHP que guarda el contenido del buffer de salida en un archivo HTML y en la siguiente solicitud si el archivo existe, devolverá el contenido de archivo en lugar de buscar datos de la base de datos o lo que sea.

El código es así, tan simple:

$content = ob_get_contents();
if (!is_dir($cacheFolderPath))
    mkdir($cacheFolderPath);
      
file_put_contents($filePath, $content);

El mecanismo está trabajando como se espera tanto en el desarrollo como en la producción. Sin embargo, cuando lo uso en la producción que es un host Cpanel compartido, el uso de la memoria aumenta significativamente, y cuando borro el archivo del disco duro del servidor el uso de la memoria vuelve a la normalidad. Pero de nuevo cuando los visitantes visitan las páginas y los archivos de caché crean, el uso vuelve a subir. Usted puede ver el gráfico a continuación que muestra el uso de la memoria hoy. En cualquier lugar que he dibujado la estrella roja, es cuando borré todos los archivos creados por el código anterior.

enter image description here

Parece que cuando file_put_contents() crear un archivo en el duro, también crea una referencia de él en la memoria sin ninguna razón. Y cuando borro el archivo, ya que el archivo original no existe, la referencia en la memoria se libera automáticamente.

He buscado mucho y no he encontrado ningún problema de fuga de memoria con file_get_contents() pero parece que hay algunos problemas.

Lo que he probado:

  • Cambiar versiones PHP = curso No hay cambio
  • Uso fopen, fwrite, fclose en lugar de eso = No hay cambio
  • Pruebas sobre el desarrollo de Windows enviorenment = confianza No hay problema de fuga de memoria
  • Comentando el código anterior sobre la producción = Problema de fuga de memoria también desapela

Cualquier comentario, las mismas experiencias con cualquier posible solución, consejos, etc. es muy apreciado!

Pregunta hecha hace 3 años, 5 meses, 2 días - Por scriptsphinx


2 Respuestas:

  • El problema que estás experimentando con el aumento de uso de memoria al utilizar la función file_put_contents() en un entorno de producción compartido podría estar relacionado con la gestión de la memoria del servidor en ese entorno específico.

    Aquí hay algunas posibles soluciones que podrías intentar para mitigar el problema de pérdida de memoria:

    • Liberación del buffer de salida: Después de guardar el contenido en el archivo, es recomendable limpiar el buffer de salida utilizando `ob_end_clean()` para liberar la memoria utilizada por el buffer. Esto ayudará a reducir la carga en la memoria del servidor.
    • Limitar la cantidad de archivos en caché: Si tienes un gran número de archivos en caché, cada uno consumirá memoria adicional. Considera implementar una estrategia para limpiar periódicamente los archivos de caché antiguos que ya no son necesarios.
    • Optimización del código: Revisa tu código para asegurarte de que estás cerrando adecuadamente los recursos que estás utilizando, como por ejemplo, cerrar el puntero del archivo después de escribir en él si optas por usar `fopen`, `fwrite` y `fclose`.
    • Investigar la configuración del servidor: Es posible que haya configuraciones específicas en el entorno de servidor compartido que estén contribuyendo al problema de pérdida de memoria. Podrías contactar al proveedor de hosting para obtener más información al respecto.

    Espero que estas sugerencias te ayuden a resolver el problema de pérdida de memoria al utilizar file_put_contents() en tu entorno de producción. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 18:15 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con la pérdida de memoria en PHP al usar file_put_contents() en un host compartido de cPanel probablemente se deba a una combinación de factores, incluida la naturaleza compartida del entorno y la forma en que PHP maneja los archivos.

    Natureza compartida del alojamiento cPanel

    En un entorno de alojamiento compartido, múltiples sitios web comparten los mismos recursos del servidor, incluida la memoria. Cuando se crea un archivo con file_put_contents(), se asigna memoria para almacenar el contenido del archivo en el búfer del sistema operativo. Sin embargo, en un entorno compartido, este búfer puede no liberarse correctamente cuando se cierra el script PHP, lo que lleva a una pérdida de memoria.

    Manejo de archivos de PHP

    PHP utiliza internamente un mecanismo llamado "streams" para interactuar con archivos. Cuando se abre un archivo con file_put_contents(), se crea un "stream" que representa el archivo abierto. Este flujo permanece abierto hasta que se cierra explícitamente o hasta que se destruye el script PHP. Si el script PHP termina sin cerrar el flujo, la memoria asignada para el flujo no se libera, lo que contribuye a la pérdida de memoria.

    Solución:

    Para resolver el problema de pérdida de memoria, puedes intentar lo siguiente:

    • Cerrar explícitamente los flujos: Después de usar `file_put_contents()`, asegúrate de cerrar el flujo manualmente usando `fclose()`.
    • Usar un bloque de prueba/captura: Encierra el código que utiliza `file_put_contents()` en un bloque de prueba/captura. Si se produce una excepción, asegúrate de cerrar el flujo en el bloque de captura.
    • Deshabilitar la memoria compartida: Si es posible, deshabilita la memoria compartida de PHP configurando `apc.enable_cli=Off` en tu archivo php.ini.
    • Actualiza PHP: Asegúrate de estar usando la última versión de PHP, ya que puede incluir correcciones de errores o mejoras de rendimiento que mitigan el problema.

    Código de ejemplo:

    php
    
    

    Nota: En lugar de utilizar file_put_contents(), también puedes usar la función file_put_contents(), que escribe directamente en el disco sin almacenar el contenido en un búfer. Esto puede ayudar a reducir la pérdida de memoria en algunos casos.

    Además de las soluciones anteriores, también es importante optimizar tu código y evitar crear archivos innecesarios. Monitoriza el uso de memoria de tu aplicación y realiza pruebas periódicas para detectar fugas de memoria.

    Respondida el Dec 19, 2020 a las 18:21 - por Gemini

    Votos positivos: 0 | Votos negativos: 0