Servidor Ubuntu 16.04: aumentar el límite de memoria de PHP

Para aumentar el límite de memoria de PHP ejecutándose como un módulo de Apache en Ubuntu 16.04, cambie el valor de memory_limit en el archivo PHP php.ini correspondiente, luego reinicie Apache y verifique el valor aplicado en una solicitud web. Dado que PHP-FPM o PHP CLI pueden usar archivos de configuración diferentes, primero necesita comprobar el método de ejecución.

Ámbito de aplicación y verificación antes del cambio

Este artículo es un ejemplo de cómo inspeccionar un servidor existente basado en PHP 7.0 y el módulo Apache en Ubuntu 16.04. El soporte de seguridad general para Ubuntu 16.04 ha terminado, y después del mantenimiento de seguridad extendido, puede aplicarse un soporte Legacy separado. Verifique el alcance de la aplicación en Cronograma de mantenimiento de seguridad de Ubuntu y planifique la migración a un entorno compatible.

memory_limit es una configuración que limita la memoria que un script PHP puede asignar. No es la memoria máxima de la memoria física instalada en el servidor ni la memoria total compartida por múltiples solicitudes. Aumentar el límite puede incrementar la carga de memoria del servidor dependiendo del número de solicitudes simultáneas, por lo que debe verificar tanto la memoria disponible como los errores reales. El valor predeterminado puede variar según las configuraciones de PHP y la aplicación.

Encontrar la configuración de PHP utilizada en la web

En la instalación básica del módulo Apache de PHP 7.0 en Ubuntu 16.04, se utiliza /etc/php/7.0/apache2/php.ini. Sin embargo, la ruta puede variar dependiendo de la versión de PHP, el método de instalación y las configuraciones separadas. PHP-FPM usualmente utiliza un fpm/php.ini separado, y no se debe asumir que el php --ini obtenido desde la línea de comandos coincida con la configuración para una solicitud web.

En un entorno de prueba restringido, crea un archivo PHP temporal en el directorio de documentos web e inserta el código abajo. Abre el archivo en un navegador para verificar el método de ejecución, la ruta del archivo de configuración y el límite actual. No lo coloques en un entorno público, ya que se expondrá información del servidor como rutas de archivos, y elimínalo inmediatamente después de verificarlo.

<?php
header('Content-Type: text/plain; charset=UTF-8');
echo 'SAPI: ' . PHP_SAPI . "\n";
echo 'Loaded ini: ' . php_ini_loaded_file() . "\n";
echo 'memory_limit: ' . ini_get('memory_limit') . "\n";

Si es apache2handler, utiliza el método del módulo Apache, y si es fpm-fcgi, utiliza el método PHP-FPM. Si el archivo de configuración no aparece o es diferente de lo que espera, verifique la instalación y la conexión al servidor web. PHP puede leer archivos .ini adicionales además del archivo predeterminado y los valores pueden ser sobrescritos por la configuración de la aplicación o del servidor. Para más detalles, consulte documentación del archivo de configuración de PHP.

Modificando memory_limit

El siguiente es un ejemplo cuando la ruta verificada en la web es /etc/php/7.0/apache2/php.ini. Si es una ruta diferente, aplíquela al archivo que realmente verificó. Antes de editar, asegúrese de que aún no exista un archivo de respaldo, y si existe, cambie el nombre del respaldo en el comando a continuación por un nuevo nombre.

sudo cp -a -n /etc/php/7.0/apache2/php.ini /etc/php/7.0/apache2/php.ini.before-memory-limit
sudo nano /etc/php/7.0/apache2/php.ini

Encuentra la configuración existente memory_limit en el editor, cámbiala a los valores requeridos y guarda. Por ejemplo, si el valor existente es 128M y descubres que se necesita más para la tarea, puedes probar con 256M. Los siguientes valores son ejemplos y no son valores recomendados adecuados para todos los servidores.

memory_limit = 256M

El valor -1 elimina el límite; no lo uses indiscriminadamente para resolver problemas. La causa de la falta de memoria puede ser una gran entrada, código ineficiente o solicitudes concurrentes. El significado de los valores se puede encontrar en descripción de memory_limit de PHP.

Aplica en Apache y verifica

En el método del módulo Apache, primero realice una verificación de configuración. Syntax OK debería aparecer para proceder al siguiente paso. Si la verificación falla, resuelva los errores y luego verifique nuevamente. Esta verificación comprueba la configuración de Apache y no garantiza que los límites de PHP se apliquen correctamente en las solicitudes web.

sudo apache2ctl configtest

Si la verificación tiene éxito, reinicie Apache en un momento adecuado. Reiniciar puede afectar las conexiones y las solicitudes en curso, por lo que se debe revisar el impacto en el entorno de producción.

sudo systemctl restart apache2
sudo systemctl status apache2

Verifique que el servicio esté funcionando normalmente y solicite el archivo de verificación de PHP de acceso restringido creado anteriormente para ver si memory_limit muestra el valor previsto. Después de la verificación, elimine el archivo temporal. Además, asegúrese de que los errores no se repitan en la aplicación real.

En el caso de PHP-FPM, simplemente actualizar los archivos del módulo de Apache mencionados y reiniciar puede no aplicar los ajustes de FPM. Verifique el archivo de configuración FPM realmente cargado y el nombre del servicio en uso, y siga el procedimiento de verificación de configuración y reinicio para ese servicio.

Cuando no se aplica o ocurren problemas

Si el valor comprobado en la web es diferente, verifique si la ruta editada, la versión de PHP y el método de ejecución son correctos. El valor también puede diferir en archivos adicionales .ini, en la configuración de Apache, en los ajustes del pool FPM y en el ini_set() de la aplicación. Si ocurren errores de memoria incluso después de los cambios, necesita revisar juntos el registro de errores, los detalles del trabajo y el uso de memoria del servidor.

Si necesitas revertir los cambios, verifica el contenido de los archivos de configuración respaldados y restaúralos en los archivos originales, luego realiza nuevamente una verificación de la configuración de Apache y un reinicio del servicio. Si la ruta de respaldo es diferente del ejemplo, utiliza la ruta de respaldo real. También puedes mantener por separado la configuración actual antes de la restauración para comparar los cambios.