Matteo Vignoli

Sviluppatore Web Full-Stack autodidatta, curioso per natura,
attualmente impiegato a Milano presso ContactLab per conto di Anoki S.r.L.

Composer update su server con poca memoria, come risolvere il problema

  Tempo di lettura:

Composer è una delle innovazioni migliori che siano arrivate nell'ecosistema PHP degli ultimi anni (2012), ed è venuto a colmare un gap che stava diventando sempre più evidente in rapporto ad altri linguaggi (Bundler ad esempio, o NPM).

Un package manager intuitivo e veloce (PEAR, pur avendo la stessa funzione, non ha saputo forse stare al passo coi tempi)  è qualcosa di cui si sentiva davvero la mancanza e la sua rapida adozione ha contribuito a ridare un soffio di vita ad un linguaggio che è sempre stato avvolto da un alone di critiche e dubbi (molti, a dir la verità, anche a ragione) - contribuendo anche così alla nascita di standard proposti dalla community (vedi il FIG).

Ma andiamo al punto: Composer si porta dietro anche dei difetti, naturalmente, ed uno di questi è quello di utilizzare un discreto quantitativo di RAM, specialmente nelle operazioni di update: questo comando dice all'algoritmo interno di Composer di cercare aggiornamenti per ogni pacchetto indicato nel json, controllare le relative dipendenze associate, ecc. ed agire di conseguenza.

Niente di problematico su una macchina di sviluppo, in cui di solito è disponibile una quantità di RAM decente; il problema nasce quando si deve lavorare su server (fisici o virtuali) dalle risorse limitate, o dove non si ha la possibilitè di effettuare modifiche alla configurazione perchè non si ha un accesso di root. Non solo, nel mio caso non ricevevo neanche il classico errore di PHP

Allowed memory size of X bytes exhausted tried to allocate X bytes

ma un semplice "Killed" da parte del terminale: solo eseguendo composer --profile -vvv sono riuscito a vedere che la RAM usata saliva progressivamente fino a far terminare l'esecuzione all'improvviso una volta superati i 600 e rotti Mb.

Le possibili soluzioni

Il primo tentativo da fare è quello di esigere più RAM; se il problema è un limite alle impostazioni nel php.ini, infatti, eliminando (o aumentando) questo limite il problema si risolve con un po' di pazienza in piu:

$ php -d memory_limit=-1 /usr/bin/composer update

(oppure esplicitare la dimensione, -d memory_limit=4016M, ad esempio).

Purtroppo questo non funziona se la macchina è limitata fisicamente: in questo caso RAM in più non ce n'è, non si scappa. Bisogna arrangiarsi in un altro modo.

Aggiornare solo un pacchetto, oppure eseguire il require

Se lo scopo è quello di installare una sola libreria, oppure aggiornarne una nello specifico, possiamo essere più fortunati: rispetto all'update generale il require ha bisogno di meno memoria per il minor numero di lookup che deve fare - ma non sempre riesce, perchè potremmo trovarci di fronte ad un pacchetto che richiede delle dipendenze da scaricare, o peggio ancora già presenti ma da controllare.

Uno dei metodi che uso più spesso, e che finora mi ha sempre risolto la situazione, è quello di seguire questi 3 passi:
  1. fare un composer update sulla mia macchina locale, dove la RAM è in abbondanza per un'operazione del genere (che poi stiamo parlando di 1,5Gb al max, generalmente).
  2. rimuovere la cartella vendor sul server con poca RAM e trasferire, su questa macchina, il file composer.lock locale
  3. eseguire un composer install sul server e vedere la magia. L'install, infatti, è un'operazione che ha un'impronta molto bassa sulle risorse della macchina, e per problematiche come queste è la chiave di volta.

Smettere di fumare: un anno senza sigarette

Oggi è un anno esatto da quando ho deciso di smettere di fumare.Un anno senza sigarette che, devo dire la verità, si è rivelato più...

Scrapy, Mailgun: raccogliere i risultati degli spider ed inviarli via mail

Scrapy, per chi non lo conosce, è un framework scritto in python usato per effettuare scraping e crawling di pagine web, molto veloce e potente ma...

MatteoVignoli.it   Non perderti nulla da MatteoVignoli.it, ricevi aggiornamenti via mail.