Newsgroup: it.comp.www.php
Titolo: problema grave col ridimensionamento immagini

Salve a tutti,
per un sito internet che ho realizzato
(una sorta di community per designers)
mi sono avvalso di phpThumb per il ridimensionamento e
il crop delle immagini.
Sebbene il limite imposto al caricamento dlle immagini da parte 
dell'utente X fosse 5mb, siamo arrivati a saturare le capacità di 
calcolo del server dove giace il sito, tanto che mi hanno rinominato il 
file phpThumb.php in un altra cosa provocando un notevole disservizio al 
sito (che conta 600visite al giorno).
Lasciando stare il disservizio, perchè è stato momentaneo e pur 
comprendendo le ragioni dell'hosting provider, vi faccio questa domanda:
voi come vi comportate quando avete a che fare con un'ingente mole di 
immagini?
Io al momento facevo solo caricare la foto e phpThumb mi faceva tutte le 
operazioni, cachando il file.
Ora invece stavo pensando di far caricare la foto, usare gd per 
ridimensionarla creandone una nuova e gettando via l'originale.
Il problema rimane il crop al centro, che non ho ben capito come realizzare.
Voi che fareste?
Avete suggerimenti, avete classi che utilizzate, funzioni? Ogni aiuto è 
prezioso, anche perché siamo a rischio sospensione sito.
Grazie a tutti
Franz

 a che fare con un'ingente mole di immagini?
5 MB a immagine? Troppo. Limitale a 500 KB.
Elaborare un'immagine da 5 MB e` un massacro anche per un PC dedicato, 
figurarsi per un sito in hosting. :)
Non penso che il limite sia lo spazio disco delle immagini. Probabilmente 
ti darà errore di spazio esaurito quando finisci quello allocato dal 
provider. Il problema e` proprio la pesantezza dell'elaborazione. In 
pratica stai "rubando" il processore a tutti gli altri siti ospitati li`.
Quindi phpThumb, gd o imagick che sia non cambia molto, IMHO.
Bye.


Alessandro, hai ragione, ma 500kb per dei progettisti sono davvero 
pochi. Sicuramente sposteremo il limite a una cifra inferiore...presumo 
1.5mb.
In ogni caso si...il problema è proprio quello di consumare le risorse 
della cpu a discapito degli altri siti ospitati sulla stessa macchina.
PhpThumb ora fa un ridimensionamento on the fly a valle.
Ora invece vorrei cambiare le cose in un ridimensionamento a monte che 
viene dunque operato solo una volta e non 100 volte per 100 immagini che 
vengono visualizzate durante una  navigata sul sito (numeri reali...100 
immagini si raggiungono in un niente).
Rimane sempre la stessa domanda...suggerimenti?
Io ho scritto qualcosa per le jpg, ma le immagini possono essere anche 
png o gif o bmp.
Forse dovrei limitare anche l'estensione. Solo jpg e png e basta.
Cacchio sono nel pallone
Franz

 si raggiungono in un niente).
Aspetta... io avevo capito che l'elaborazione viene fatta all'upload.
Se lo fai on the fly ad ogni accesso al sito, hanno ragione a "staccarti 
la spina". :)
Tieni l'originale, ma al primo accesso elabori l'immagine e la salvi in 
una cache su disco, e le volte successive mostri l'immagine in cache.
Non ha senso rielaborarla ogni volta.
Bye.

 Non ha senso rielaborarla ogni volta.
phpThumb fa esattamente questo: cacha le immagini e le ripesca per non 
ricalcolare e ritagliare il tutto daccapo.
ora ho aumentato la cache e speriamo che la cosa serva a tamponare 
l'emergenza.
In pratica ora a phpThumb do in pasto una img src, lui controlla che 
esista in cache, altrimenti la ritaglia e la ridimensiona on the fly.
Non capisco dunque come mai c'è tutto sto consumo assurdo di risorse, in 
quanto la prima operazione che fa la classe è quella di confronto e di 
esistenza del file cachato.
Solo se non c'è, viene operata una serie di comandi sull'immagine.
Cacchio cacchio cacchio
Franz

 Franz
La prima cosa che mi viene in mente: prova a fare un debug di
phpThumb, magari gli passi una path errata, o un permesso troppo
restrittivo, e non riesce a creare/ritrovare le immagini in cache e le
riscrive ogni volta al volo.
Anche se, con 600 visite al giorno che visualizzano 100 immagini (se
ho capito bene) contemporaneamente, una cosa del genere ti avrebbe
piantato il server dopo due settimane.

 prezioso, anche perch siamo a rischio sospensione sito.
se lo scenario è praticabile, potresti pensare ad una generazione
batch notturna delle thumbnail, quando presumibilmente l'impatto sul
processore è meno importante.
In pratica quando gli utenti fanno l'upload vanno a finire in una
cartella "spool" e non sono immediatamente visibili: ogni notte poi
fai girare un batch basato su imagemagick che crea la thumbnail, una
tantum, e la pubblica.
Prerequisiti ovviamente sono la disponibilità di un crontab
sull'hosting e ovviamente il fatto di poter aspettare 24 ore per la
pubblicazione definitiva...
bye!


Bhè si potrebbe anche mettere in coda le immagini e far girare un cron
ogni 10 minuti, processando X immagini a ciclo, mostrando un'immagine
standard per quelle non ancora processate.
Magari durante le ore 'calde' processare poche immagini per volta, e
durante le ore con meno carico fare il grosso del lavoro.

Volendo puoi anche strutturare un throttle sulle cpu
http://stackoverflow.com/questions/3796429/can-i-throttle-the-max-cpu-usage-of-a-php-script/3798688#3798688
(se l'hoster te lo permette)

 pubblicazione definitiva...
soluzione purtroppo non praticabile, in quanto essendo una sorta di 
community, la disponibilità delle immagini caricate deve essere immediata.
Grazie per il suggerimento
Franz


No, l'hoster non lo consente.
Temo che prenderemo un server in co-location che però ha dei costi che 
attualmente non sono sostenibili.
Bah...vedremo come finirà sta storia
Franz

 Franz
Ripet, la prima cosa da fare è verificare il corretto funzionamento di
phpThumb, non l'ho mai usato, ma aggiungi dei log per vedere se
effettivamente crea e usa le immagini in cache o se rifà il lavoro
tutte le volte

 community, la disponibilità delle immagini caricate deve essere immediata.
La community è disposta a sganciare qualcosa per cambiare hosting o a 
comprimere i file sul proprio computer prima dell'upload?

,

Oddio mi hai fatto venire un'idea delle mie (i castelli di carta per
aria): e se quando l'utente carica l'immagine tu in realtà la carichi
su servizi esterni (tipo imageshack per capirci, ma ne ho visto alcuni
che nelle api ti lasciano settare tutti i vari ridimensionamenti e non
mettono link o watermark), dopodichè o a db ti salvi l'url
dell'immagine, oppure ti scarichi direttamente le dimensioni che ti
servono.
Si, mi rendo conto essere un'idea malsana che forse nemmeno io
implementerei ;)

 implementerei ;)
Grazie per l'idea.
A dir la verità ci avevo pensato.
In ogni caso ho fatto come anticipato:
al momento delll'upload una funzione prende l'img la ridimensiona
la croppa, ci aggiunge i filtri del caso e mi salva le varie thumbnails
che hanno stesso nome ma con prefisso diverso.
Poi cancello il file uploadato.
Cosi non devo preoccuparmi di uno smodato consumo di spazio.
Nel db ci finisce solo il nome senza prefisso, cosi quando richiamo da 
html devo soltanto fare una chiamata al campo img del db e aggiungere il 
prefisso.
La parte difficile sarà convertire ora tutte le immagini gia presenti 
sul filesystem.
Saranno almeno 3000.
Suggerimenti?
Franz

 Suggerimenti?
Crea uno script che lavori sulle immagini già presenti sul filesystem, 
la funzione rimane la stessa ma scorre i file rimasti invece che 
riceverne uno via form.

 Suggerimenti?
Visto che quelli dell'hosting ti hanno già bloccato una volta, io
fossi in te lo farei in locale.
Ti scarichi le immagini, poi o con un tool tipo phatch, oppure ti
metti in locale lo stesso script che hai sul sito, le ridimensioni,
poi le uppi e aggiorni il db, così non tocchi il server e
probabilmente fai anche prima (rimane lo sbattimento di scaricarle e
ricaricarle).
A pensarci bene, dovendo poi aggiornare il db, è meglio se usi
direttamente lo script che hai sul server, così poi ti carichi il dump
su un altro db (hai la possibilità di creare un altro db sul server?)
e ti fai lo script di aggiornamento (questo perchè immagino il sito
stia andando avanti e non vuoi ne sovvrascrivere i dati ne incasinare
gli id)
Altrimenti vai di cron (spero almeno questo ce l'hai, altrimenti
esistono vari sistemi per imitarlo, tutte idee malsane ma funzionanti)

 esistono vari sistemi per imitarlo, tutte idee malsane ma funzionanti)
Avevo pensato di scaricare tutte le immagini in locale e di utilizzare 
la mia funzione, ma mi va in timeout.
Come faccio per evitare di ottenere un timeout sull'esecuzione?
Mi basta intervenire su php.ini? O ci sono altri metodi piu performanti?
In ogni caso, quali sono queste idee malsane per emulare un cron?
:)
Franz

 In ogni caso, quali sono queste idee malsane per emulare un cron?
Il poor's man cron, cioè quando c'è una richiesta web ne approfitti per 
controllare i lavori che hai schedulato. Nel tuo caso puoi mandare tu 
stesso le richieste necessarie per tenerlo sufficientemente reattivo.

 :)
Il poor man's cron, ce ne sono varie implementazioni, ma a grandi
linee:
1. decidi il ogni quante volte deve essere eseguito (chiamiamolo tempo
X)
2. a ogni visita di pagina, ti salvi l'ora della visita, e se sono
passati più di X minuti dall'ultimo cron, lo lanci.
In poche parole lo fai eseguire ai tuoi utenti il cron, uno su mille
si becca questo compito e (a meno che non sia un cron particolarmente
pesante) non dovrebbe accorgersi di nulla, solo un rallentamento nel
caricamento della pagina.

 essere in secondi.
Io non passerei per il server web avendo le immagini già scaricate.

 Io non passerei per il server web avendo le immagini già scaricate.
io li parlavo del suo pc, non del server web dove ha il sito (che da
quel che ho capito, essendo su un hosting limitato, dubito possa
modificare il php.ini o riavviare apache).
Facciamo un riepilogo, o si scarica le 3000 immagini sul suo pc, le
processa, poi le riuppa e aggiorna il db online, oppure sul suo pc
mette un cron che 'pinga' ogni x secondi uno script sul server che
processa x immagini per volta.
Col primo metodo il problemi sono il download, poi l'upload, e la
creazione di uno script che sincronizza il database con le nuove
immagini. vantaggi: non tocca minimamente la cpu del server, una volta
scaricate mette li un muletto che lavora giorno e notte e secondo me
in un giorno o due al max ha finito.
Col secondo metodo non ci sono download e problemi di aggiornamento,
ma essendo tante immagini ed essendo già stato 'avvertito' dall'hoster
fossi in lui farei veramente poce immagini per volta, impiegando un
sacco di tempo per farle tutte.

 in un giorno o due al max ha finito.
il mio metodo è stato proprio questo Daniel.
Scaricato tutto, processate e riuppate.
Tempo per fare tutto 8 ore filate.
Script in php che me le ha croppate e ridotte e via...
Ora sono salvo!
:)
Grazie a tutti per aver seguito il thread
Franz

 Scaricato tutto, processate e riuppate.
Resta da capire cosa andasse in timeout, l'errore che hai riportato era 
completamente fuori contesto.