Magento 2

Gli application mode in Magento 2

Lettura 6 minuti

Introduzione

In questo articolo diamo uno sguardo agli application mode di Magento 2.

Su Magento 1 un concetto simile è rappresentato dal developer mode, attivabile tramite la direttiva MAGE_IS_DEVELOPER_MODE (tipicamente specificata come variabile d’ambiente del server) che consente di forzare il logging, rendere gli errori causati da eccezioni visibili nel browser (anziché scriverli nella cartella var/report) e di modificare alcuni comportamenti applicativi per facilitare il debugging.

In Magento 2 il concetto di application mode è stato arricchito ed è importante comprendere bene le differenze tra i vari mode perché questi determinano:

  • il modo in cui i file statici vengono serviti
  • la modalità con cui viene generato il codice dinamico
  • la modalità di visualizzazione e la verbosità di eventuali errori dell’applicazione

I principali application mode sono:

  • Developer
  • Production
  • Default

Ne esiste un quarto, il Maintenance mode che, come è intuibile, consente di mettere l’applicazione in modalità di manutenzione per prevenirne l’accesso in fase di aggiornamento. Vedremo più avanti in che modo il Maintenance mode differisce dagli altri, per il momento anticipo solo che si comporta in maniera molto simile al maintenance mode di Magento 1.

Developer mode

Il Developer mode è l’application mode da utilizzare in ambiente di sviluppo perché in questa modalità viene saltata la fase di generazione di codice che caratterizza il Production mode, come vedremo in seguito.

In Developer mode Magento non genera file statici nella cartella pub/static ma crea dei link simbolici (symlink) a partire dalle cartelle web dei diversi moduli.

Ciò rende le modifiche a tali file immediatamente visibili nel browser.

Poiché in Developer mode molti file sono generati su richiesta, è altamente sconsigliato utilizzarlo in ambiente di produzione per via dell’impatto negativo che ha sulle prestazioni.

Riepilogando, le caratteristiche principali sono:

  • Ad ogni richiesta, i file statici mancanti, tipicamente JavaScript, CSS e immagini, sono sempre generati (sotto forma di symlink) nella cartella pub/static e le modifiche a tali file sono subito visibili; questo comporta una penalizzazione delle prestazioni.
  • La minificazione degli asset JavaScript, CSS e HTML non viene applicata; questo indipendentemente dalla configurazione di sistema.
  • Il codice dinamico viene generato automaticamente.
  • Vengono lanciate alcune eccezioni aggiuntive, come ad esempio in caso di:
    • invocazione di metodi non dichiarati;
    • accesso a cartelle non esistenti;
    • observer che non implementano l’interfaccia corretta;
    • errori nelle direttive di ordinamento di elementi di layout.
  • Le eccezioni non gestite sono visualizzate direttamente nel browser.
  • Le informazioni sugli errori sono molto più dettagliate, tipicamente gli errori riportano lo stack trace della chiamata che lo ha generato.

Production mode

Il Production mode è l’application mode raccomandato in ambiente di produzione ed è sconsigliato utilizzarlo in ambiente di sviluppo per via del fatto che:

  • molti errori applicativi sono soppressi o riportano meno dettagli
  • molti contenuti sono serviti da cache e/o minificati

Le caratteristiche principali sono:

  • Le prestazioni sono massimizzate grazie all’utilizzo della cache e di codice precompilato.
  • I file statici sono serviti dalla cartella pub/static in cui devono essere stati precedentemente pubblicati (o, come troverete scritto spesso, materializzati); ogni modifica a file di questo tipo richiede una nuova attività di pubblicazione attraverso il comando bin/magento setup:static-content:deploy.

    Se si aggiungono asset ai propri moduli e non si passa dalla fase di pubblicazione, la richiesta a quelle risorse genererà una risposta HTTP di tipo 404 Not Found.

  • Gli eventuali errori non sono visualizzati nel browser ma tracciati nei log.

A chi utilizza IDE, come PhpStorm, che indicizzano automaticamente i nuovi file trovati nella cartella di progetto, consiglio di escludere i seguenti path dall’indicizzazione per evitare che questa intervenga durante la fase di compilazione aumentando inutilmente il consumo di risorse:

  • var/di
  • var/generation
  • var/view_preprocessed
  • pub/static

Default mode

Il Default mode è l’application mode attivo al termine di ogni nuova installazione.

Rappresenta una modalità ibrida tra il Developer e il Production mode e non è particolarmente indicato né per ambienti di sviluppo né per ambienti di produzione.

Potrebbe essere impostato ad esempio in quegli ambienti di produzione in cui non si può avere una fase di rilascio ed è quindi necessario apportare modifiche dirette.

Il Default mode effettua la materializzazione degli asset dinamicamente, vale a dire che genera gli asset statici in pub/static nel momento in cui vengono richiesti e non trovati la prima volta; non richiede quindi di passare per la fase di pubblicazione. Questo però va a discapito delle prestazioni.

Ricapitolando, le caratteristiche principali del Default mode sono:

  • I file statici, tipicamente JavaScript, CSS e immagini, sono generati alla prima richiesta nella cartella pub/static e serviti staticamente alle successive richieste.
  • Gli eventuali errori non sono visualizzati nel browser ma tracciati nei log in certi casi con un livello di verbosità inferiore rispetto al Developer mode.

Come attivare i diversi application mode

I diversi application mode si possono attivare in tre modalità; le prime due elencate di seguito, mutatis mutandis, ricalcano la modalità di attivazione del Developer mode in Magento 1:

  • Attraverso una variabile d’ambiente MAGE_MODE=[developer|default|production] definita nel file .htaccess se si utilizza il web server Apache. Quest’ultimo deve essere configurato in modo da permettere le direttive nei file .htaccess.
  • Attraverso la direttiva precedente, definita nel file di configurazione del virtual host se si utilizza il web server Apache o attraverso la seguente direttiva di configurazione se si utilizza il web server NGINX:

    fastcgi_param  MAGE_MODE [developer|default|production]

  • Attraverso il seguente comando shell eseguito dalla cartella di installazione di Magento 2:

    bin/magento deploy:mode:set developer|default|production

Il Maintenance mode

Il Maintenance mode è utilizzato quando occorre impedire l’accesso pubblico allo store Magento in occasione di attività di aggiornamento.

L’attivazione del Maintenance mode va fatta ponendo un file (vuoto) denominato .maintenance.flag nella cartella var.

Se si vuole permettere l’accesso ad un determinato gruppo di utenti identificati da uno o più indirizzi IP, è possibile specificarne l’elenco separato da virgola in un file denominato .maintenance.ip da collocare sempre nella cartella var.

Anche in questo caso è possibile utilizzare lo strumento a riga di comando di Magento 2 per abilitare/disabilitare il Maintenance mode e definire l’elenco degli indirizzi IP da escludere:

  • bin/magento maintenance:status - per verificare lo stato
  • bin/magento maintenance:disable - per disabilitare il maintenance mode
  • bin/magento maintenance:enable - per abilitare il maintenance mode
  • bin/magento maintenance:allow-ips - per definire l’elenco degli indirizzi IP da escludere

Conclusioni

Magento 2 consente di utilizzare diversi application mode a seconda dei contesti: produzione, sviluppo, manutenzione.

I diversi application mode influenzano la gestione del codice e degli errori in Magento e per questo è importante conoscerne le differenze e imparare ad utilizzarli nel contesto corretto.

L’attivazione degli application mode è facilitata dal nuovo strumento a riga di comando di cui tratteremo nei prossimi articoli.

Articolo scritto da

COO | Reggio Emilia

Alessandro lavora in Bitbull come team leader, esperto di software design e sviluppo di soluzioni ecommerce.
Membro attivo della community Magento come contributor e maintainer, ha ricevuto per tre volte il riconoscimento di Magento Master e Top 50 Contributor.
Dal 2020 è membro della Magento Association content committee.

☝ Ti piace quello che facciamo? Unisciti a noi!