23 Nov 2012
Inserito da: Andrea Lanfranchi in: Mondo IT, Programmazione
Uno 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
10 Commenti
Marco Monacchi
14-Dic-2012 1Ciao,
interessante il tuo script ma siceramente non ho capito come utilizzarlo visto che non ho la possibilità di usare sh.
E’ possibile lanciarlo come semplice file php?
Poi sici che è possibile solo fare un controllo senza cancellare nulla…in che modo?
Lo script è sicuro? o rischi di cancellare quello che deve rimanere?
Ciao e grazie per il tuo tempo prezioso.
Saluti
Marco
Andrea Lanfranchi
14-Dic-2012 2Ciao Marco e grazie per i complimenti.
Purtroppo per lanciare lo script devi avere un accesso SSH essendo uno script bash. Comunque se hai familiarità con php puoi facilmente tradurlo.
Lo script è sicuro ? Ah … bella domanda. Allora si è sicuro perchè è in chiaro e non fa cose nascoste. Se ometti il parametro doit durante il lancio verrà eseguito solo un controllo e non verrà cancellato assolutamente nulla. Se invece il parametro c’è allora vengono cancellate tutte le immagini che non trovano riferimento nel database di magento.
In ogni caso vale sempre la regola d’oro …. BACKUP BACKUP e ancora BACKUP.
Ciao
emanuele
06-Mar-2013 3Salve Marco,
ma dal tuo script , se metto # nell’istruzione <> alla riga 24 , il programma girerà senza cancellare le immagini giusto ?
Ho provato ma non mi esce mai la scritta :”Removing unused image….” nonostante prima mi esca “”Found unused image….”
grazie
Emanuele
Andrea Lanfranchi
06-Mar-2013 4Ciao Emanuele, io sono Andrea non Marco.
Non devi modificare lo script. Se vuoi farlo girare solo per un controllo lancialo così
Se invece vuoi effettivamente cancellare le immagini inutilizzate lancialo così
emanuele
06-Mar-2013 5ops .. volevo dire Salve Andrea … mi son confuso con l’autore 😉
andrea
13-Lug-2013 6Ciao Andrea,
Siccome hai parlato di diverse estensioni per ovviare al problema sotto forma di plug-in ed estensioni, potresti indicarmene qualcuna.
Purtroppo non sono capace di utilizzare il tuo script e preferirei una soluzione più pratica.
Grazie mille.
Un saluto.
Andrea Lanfranchi
13-Lug-2013 7Ciao Andrea,
pupi provare l’estensione Image Clean che trovi come estensione su Magento Connect.
andrea
15-Lug-2013 8Ciao Andrea,
Grazie mille per l’informazione. Mi è stata molto utile.
Nei prossimi giorni testerò per bene l’estensione in quanto ancora in versione Beta.
Grazie ancora.
Un saluto.
Marco Monacchi
30-Set-2013 9Ciao Andrea,
una curiosità sullo script:
– Ho il prodotto A che viene duplicato per generare il prodotto B
– Il prodotto A viene venduto e viene eliminato da Magento
– lancio lo script e cancello le immagini dei prodotti che non esistono e di conseguenza anche quelle del prodotto A
– cosa succede alle immagini de prodotto B? non vengono più visualizzate in quanto erano un semplice collegamento alle immagini del prodotto A?
Grazie
Marco
Andrea Lanfranchi
30-Set-2013 10Ciao Marco,
per come è la struttura di Magento, qualora due (o più) prodotti condividano la medesima o le medesime immagini, lo script non cancella le immagini ancora in uso. In pratica il ciclo dello script è questo:
Per ogni immagine
Se non è usata da alcun prodotto
Cancella immagine
Quindi, nel tuo specifico esempio, il prodotto B continuerà ad avere le immagini corrette.
Categorie
Tag
Copyright © 2007 - bloginfo('name'); ?> - is proudly powered by WordPress
InSense 1.0 Theme by Design Disease hosted by Isiweb S.r.l.