Ubuntu 16.04 Server: aumentare il limite di memoria di PHP

Per aumentare il limite di memoria di PHP in esecuzione come modulo Apache su Ubuntu 16.04, modifica il valore memory_limit nel corrispondente file PHP php.ini, quindi riavvia Apache e verifica il valore applicato in una richiesta web. Poiché PHP-FPM o PHP CLI possono utilizzare file di configurazione diversi, è necessario controllare prima il metodo di esecuzione.

Ambito di applicazione e verifica prima della modifica

Questo articolo è un esempio di ispezione di un server esistente basato su PHP 7.0 e il modulo Apache su Ubuntu 16.04. Il supporto generale per la sicurezza di Ubuntu 16.04 è terminato e, dopo la manutenzione di sicurezza estesa, potrebbe applicarsi un supporto Legacy separato. Controlla l'ambito di applicazione in Programma di manutenzione della sicurezza di Ubuntu e pianifica la migrazione in un ambiente supportato.

memory_limit è un'impostazione che limita la memoria che uno script PHP può allocare. Non rappresenta la memoria massima della memoria fisica installata sul server né la memoria totale condivisa da più richieste. Aumentare il limite può aumentare il carico di memoria del server a seconda del numero di richieste simultanee, quindi controlla sia la memoria disponibile sia gli errori effettivi. Il valore predefinito può variare a seconda delle impostazioni di PHP e dell'applicazione.

Trovare le impostazioni PHP utilizzate sul web

Nell'installazione di base del modulo PHP 7.0 Apache su Ubuntu 16.04, /etc/php/7.0/apache2/php.ini viene utilizzato. Tuttavia, il percorso può variare a seconda della versione di PHP, del metodo di installazione e delle configurazioni separate. PHP-FPM di solito utilizza un fpm/php.ini separato e non si dovrebbe presumere che il risultato php --ini dalla riga di comando corrisponda alle impostazioni per una richiesta web.

In un ambiente di test ristretto, creare un file PHP temporaneo nella directory dei documenti web e inserire il codice sottostante. Aprire il file in un browser per verificare il metodo di esecuzione, il percorso del file di configurazione e il limite attuale. Non collocarlo in un ambiente pubblico poiché informazioni del server come i percorsi dei file saranno esposti e cancellarlo immediatamente dopo la verifica.

<?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";

Se è apache2handler, utilizza il metodo del modulo Apache, e se è fpm-fcgi, utilizza il metodo PHP-FPM. Se il file di configurazione non appare o è diverso da quello che ti aspetti, verifica l'installazione e la connessione al server web. PHP può leggere file aggiuntivi .ini oltre al file predefinito e i valori possono essere sovrascritti dalle impostazioni dell’applicazione o del server. Per maggiori dettagli, consulta la documentazione del file di configurazione PHP.

Modifica di memory_limit

Il seguente è un esempio quando il percorso controllato sul web è /etc/php/7.0/apache2/php.ini. Se è un percorso diverso, applicalo al file che hai effettivamente verificato. Prima di modificare, assicurati che non ci sia ancora un file di backup e, se c'è, cambia il nome del backup nel comando sottostante con un nuovo nome.

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

Trova le impostazioni esistenti memory_limit nell'editor, modificale con i valori richiesti e salva. Ad esempio, se il valore esistente è 128M e scopri che per il compito ne serve di più, puoi provare 256M. I valori seguenti sono esempi e non sono valori consigliati adatti a tutti i server.

memory_limit = 256M

Il valore -1 rimuove il limite; non usarlo indiscriminatamente per risolvere problemi. La causa della mancanza di memoria può essere un input di grandi dimensioni, codice inefficiente o richieste concorrenti. Il significato dei valori può essere trovato in descrizione di memory_limit nella documentazione PHP.

Applicare ad Apache e controllare

Nel metodo del modulo Apache, eseguire prima un controllo della configurazione. Syntax OK dovrebbe comparire per procedere al passaggio successivo. Se il controllo fallisce, risolvere gli errori e poi ricontrollare. Questo controllo verifica la configurazione di Apache e non garantisce che i limiti PHP siano correttamente applicati nelle richieste web.

sudo apache2ctl configtest

Se il controllo ha esito positivo, riavviare Apache in un momento appropriato. Il riavvio può influire sulle connessioni e sulle richieste in corso, quindi valutare l'impatto nell'ambiente di produzione.

sudo systemctl restart apache2
sudo systemctl status apache2

Verificare che il servizio funzioni normalmente e richiedere il file di controllo PHP ad accesso ristretto creato in precedenza per vedere se memory_limit mostra il valore previsto. Dopo il controllo, eliminare il file temporaneo. Inoltre, assicurarsi che gli errori non ricorrano nell'applicazione reale.

Nel caso di PHP-FPM, aggiornare semplicemente i file dei moduli Apache sopra indicati e riavviare potrebbe non applicare le impostazioni FPM. Controllare il file di configurazione FPM effettivamente caricato e il nome del servizio in uso, e seguire la procedura di verifica della configurazione e riavvio per quel servizio.

Quando non viene applicato o si verificano problemi

Se il valore verificato sul web è diverso, controllare se il percorso modificato, la versione di PHP e il metodo di esecuzione sono corretti. Il valore può anche differire in file .ini aggiuntivi, impostazioni Apache, impostazioni del pool FPM e nella ini_set() dell'applicazione. Se si verificano errori di memoria anche dopo le modifiche, è necessario esaminare insieme il log degli errori, i dettagli del lavoro e l'utilizzo della memoria del server.

Se hai bisogno di annullare le modifiche, controlla il contenuto dei file di configurazione di backup e ripristinali nei file originali, quindi esegui nuovamente un controllo della configurazione di Apache e il riavvio del servizio. Se il percorso del backup è diverso dall'esempio, utilizza il percorso effettivo del backup. Puoi anche conservare separatamente la configurazione attuale prima del ripristino per confrontare le modifiche.