MagentoUno dei (tanti) problemi che non si pongono gli sviluppatori di Magento è lo spreco di spazio. Dopo mesi di utilizzo del vostro negozio con aggiornamenti di prodotti e soprattutto eliminazione di altri, vi troverete con lo spazio di hosting che occupate sempre più pieno. Questo perchè, nonostante l’eliminazione completa di una o più schede prodotto, le immagini relative continuano a rimanere in media/catalog/product/…

Esistono diverse soluzioni per ovviare al problema, molte delle quali sono nella forma di plugin o estensioni di Magento stesso. Ma perchè innestare un nuovo package, che probabilmente vi renderà la vita più dura in sede di futuri aggiornamenti, quando con un semplice script potete risolvere ?

Ecco allora come, con un po’ di ricerca ed un po’ di ottimizzazione, ho risolto io. Lo script si chiama imageclean.sh e può essere facilmente caricato via ftp nella directory shell della vostra installazione di magento. Dovrete solo modificarlo per indicare correttamente il percorso fisico della vostra installazione di magento ed, eventualmente, specificare l’host di connessione al database MySql.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
MAGENTO_PATH="/var/www/vhosts/mymagentosite"
LOG=${MAGENTO_PATH}/var/log/imagecleanup.log
DB_USER=$(sed -n 's|<username><\!\[CDATA\[\(.*\)\]\]></username>|\1|p' ${MAGENTO_PATH}/app/etc/local.xml | tr -d ' ')
DB_PASS=$(sed -n 's|<password><\!\[CDATA\[\(.*\)\]\]></password>|\1|p' ${MAGENTO_PATH}/app/etc/local.xml | tr -d ' ')
DB_NAME=$(sed -n 's|<dbname><\!\[CDATA\[\(.*\)\]\]></dbname>|\1|p' ${MAGENTO_PATH}/app/etc/local.xml | tr -d ' ')
 
function search_db() {
COUNT=$(mysql -u $DB_USER -p$DB_PASS $DB_NAME -N -se "SELECT count(*) FROM catalog_product_entity_media_gallery WHERE value Like \"%$1\"")
echo ${COUNT}
}
 
echo "Starting image cleanup " $(date) | tee -a ${LOG}
IMG_PATH=${MAGENTO_PATH}/media/catalog/product/
for IMG in $(find ${IMG_PATH} -type f ! -path '*cache*' ! -name 'google*'); do
  REL_IMG=${IMG:${#IMG_PATH}}
  if [ $(search_db $REL_IMG) == 0 ]; then
    IMG=${IMG##*/}
    for CACHE_IMG in $(find ${MAGENTO_PATH}/media/catalog/product/ -name "${IMG}"); do
      echo "Found unused image ${CACHE_IMG}"
      if [ "$1" ] && [ $1 == 'doit' ]; then
        echo "Removing unused image ${CACHE_IMG}" | tee -a ${LOG}
        rm -f "${CACHE_IMG}"
      fi
    done
  else
    echo "Not touching " ${IMG}
  fi
done
echo "Finished image cleanup " $(date) | tee -a ${LOG}

La semplice esecuzione dello script senza parametri effettuerà solo un controllo senza effettivamente eliminare nulla. Per eseguire effettivamente la cancellazione delle immagini non più linkate ai prodotti allora eseguite ./imageclean.sh doit