Il problema delle dimensioni della cartella img
Se avete mai gestito un ecommerce dotato di un grande catalogo prodotti, dove numerosi prodotti hanno la stessa foto (immaginate ad esempio un catalogo di prodotti generici, oppure un catalogo dove lo stesso prodotto viene caricato più volte per avere la compatibilità con differenti applicazioni), sicuramente vi sarà capitato di fare i conti con le dimensioni estremamente elevate della cartella immagini!
Facciamo un esempio:
Un esempio di uno dei nostri clienti (www.sixrace.it) può descrivere ancora meglio il problema:
Sixrace vende ricambi e accessori per moto delle migliori marche, il loro catalogo conta centinaia di migliaia di articoli, molti dei quali presentano numerose foto ciascuno (anche 20).
I prodotti caricati sul sito prestashop sixrace.it vengono caraicati numerose volte in quanto lo stesso prodotto può essere compatibile con moto differenti, per favorire l’indicizzazione google e la vendita tramite marketplace e comparatori, sixrace, ha scelto di caricare un singolo prodotto per ogni compatibilità , così da ottimizzare il seo e la ricerca da parte dei clienti.
Se prendiamo ad esempio un prodotto quasi universale come una batteria, lo stesso codice viene caricato come centinaia di prodotti differenti, ciascuno con titolo differente (comprendente l’indicazione del modello di moto) e descrizione differente. La foto tuttavia è la stessa, in quanto il prodotto originario è sempre lo stesso!
Una classica installazione di Prestashop, crea per ognuno di questi prodotti almeno 5 miniature, oltre alla foto originale!
Facciamo due conti per capire il problema:
Dimensioni foto originale: 140KB
Miniature create: 4
Dimensioni totale foto originale + miniature: 0.5MB
Totale prodotti caricati (stesso prodotto caricato con compatibilità differenti): 12500
Totale dimensioni foto salvate nella cartella IMG: 6750MB = circa 6.75GB!
Spaventoso!
Come possiamo ridurre le dimensioni di queste immagini?
Grazie ad un utilissima funzione nativa dei sistemi operativi unix based chiamata hardlink!
ATTENZIONE
Questa procedura potrebbe distruggere il vostro catalogo foto, si consiglia sempre di eseguire una prova su una cartella di backup prima di mettere in produzione il sistema.
Cosa è un Hardlink?
Un collegamento fisico (in inglese hard link), in informatica, indica l’associazione del nome di un file al suo contenuto.
Un collegamento fisico fa riferimento ai dati ovvero il contenuto di un file, e in ciò si differenzia dai collegamenti simbolici e altri tipi di collegamenti che fanno invece riferimento a nomi di file. Un’altra differenza è che il collegamento fisico deve trovarsi sullo stesso file system che contiene i dati a cui fa riferimento, e che un collegamento fisico non può restare orfano.
Come funziona?
Molto semplice, utilizziamo un pratico tool da riga di comando che si occupa di scansionare tutta la cartella immagini del nostro server e una volta identificate delle immagini uguali, le sostituisce con un hardlink all’immagine univoca, risparmiando il 99% dello spazio su disco!
Comando Unix:
matteo_lavaggi@lsws:/var/www/html/prova$ ls -li total 736 4756384 -rw-r--r-- 1 htdocs www-data 187585 Mar 1 14:32 A.jpeg 4756385 -rw-r--r-- 1 htdocs www-data 187585 Mar 1 14:32 B.jpeg 4756386 -rw-r--r-- 1 htdocs www-data 187585 Mar 1 14:32 C.jpeg 4756387 -rw-r--r-- 1 htdocs www-data 187585 Mar 1 14:33 D.jpeg matteo_lavaggi@lsws:/var/www/html/prova$ du -sh 740K . matteo_lavaggi@lsws:/var/www/html/prova$ sudo hardlink -c -t -s 100 -m /var/www/html/prova/ Mode: real Files: 4 Linked: 3 files Compared: 0 xattrs Compared: 3 files Saved: 549.57 KiB Duration: 0.00 seconds matteo_lavaggi@lsws:/var/www/html/prova$ ls -li total 736 4756387 -rw-r--r-- 4 htdocs www-data 187585 Mar 1 14:33 A.jpeg 4756387 -rw-r--r-- 4 htdocs www-data 187585 Mar 1 14:33 B.jpeg 4756387 -rw-r--r-- 4 htdocs www-data 187585 Mar 1 14:33 C.jpeg 4756387 -rw-r--r-- 4 htdocs www-data 187585 Mar 1 14:33 D.jpeg matteo_lavaggi@lsws:/var/www/html/prova$ du -sh 188K .
Terminale:
Come potete vedere, i riquadri rossi mostrano l’identificativo univoco del file (inode). Prima del comando le 4 immagini sono effettivamente 4 file differenti salvati sul disco, dopo il comando solamente l’ultima (D.jpeg) è il file reale, tutte le altre immagini sono un puntatore al file originario e occupano uno spazio praticamente nullo!
Cosa succede se cancello il file original?
A questo punto vi starete chiedendo, tutto bello, ma se cancello il prodotto al quale corrisponde l’immagine originale che è stata usata per “collegare” tutte le altre immagini, cosa succede? Spariscono le foto di tutti gli altri prodotti?
NO!
Questa è la magia del filesystem unix basato su inode! Se cancellate uno qualsiasi degli “hardlink”, non succede assolutamente nulla al “file” originale. Sino a quando ci sarà almeno un inode presente il contenuto del “file” sarà sempre presente e visibile!
matteo_lavaggi@lsws:/var/www/html/prova$ sudo rm -rf D.jpeg matteo_lavaggi@lsws:/var/www/html/prova$ ls -li total 552 4756387 -rw-r--r-- 3 htdocs www-data 187585 Mar 1 14:33 A.jpeg 4756387 -rw-r--r-- 3 htdocs www-data 187585 Mar 1 14:33 B.jpeg 4756387 -rw-r--r-- 3 htdocs www-data 187585 Mar 1 14:33 C.jpeg matteo_lavaggi@lsws:/var/www/html/prova$ ls -li total 368 4756387 -rw-r--r-- 2 htdocs www-data 187585 Mar 1 14:33 A.jpeg 4756387 -rw-r--r-- 2 htdocs www-data 187585 Mar 1 14:33 B.jpeg matteo_lavaggi@lsws:/var/www/html/prova$ ls -li total 184 4756387 -rw-r--r-- 1 htdocs www-data 187585 Mar 1 14:33 A.jpeg
Come potete vedere quello che “cambia” è il contatore riferito al nostro inode, che passa da 4 a 3, poi 2 e infine 1!
Approfondimenti:
La spiegazione proposta qui sopra utilizza termini inesatti, parla di file, inode, hardlink in modo tecnicamente non corretto per rendere il concetto più comprensibile, chi fosse tuttavia interessato ad approfondire può trovare a questo indirizzo una guida completa:
https://en.wikipedia.org/wiki/Inode
https://opensource.com/article/17/5/introduction-ext4-filesystem